Oracle SQL:将套餐价格分配至单个产品的实现方案咨询
按比例分配套餐价格到单品的SQL实现
不需要CASE语句,直接用窗口函数就能搞定核心逻辑——先计算同一套餐内所有单品的原始价格总和,再基于这个总和计算每个单品的比例,最后用套餐总价乘以比例得到分配后的价格。
假设你的订单表结构如下(字段名可根据实际调整):customer_id, bundle_name, product_name, list_price, bundle_price
对应的SQL代码如下:
SELECT customer_id, bundle_name, product_name, list_price, bundle_price, -- 计算当前单品在套餐中的价格占比 ROUND(list_price / SUM(list_price) OVER (PARTITION BY customer_id, bundle_name), 4) AS List_Ratio, -- 计算按比例分配后的套餐价格 ROUND(bundle_price * (list_price / SUM(list_price) OVER (PARTITION BY customer_id, bundle_name)), 2) AS Ratio_Bundle_Price FROM your_order_table;
代码说明:
SUM(list_price) OVER (PARTITION BY customer_id, bundle_name):窗口函数会按客户ID和套餐名称分组,计算每组(即同一客户的同一套餐)内所有单品的list_price总和,作为比例计算的分母。List_Ratio:当前单品的原始价格除以套餐内单品总价,得到该单品的价格占比,用ROUND保留4位小数方便查看。Ratio_Bundle_Price:用套餐总价bundle_price乘以该单品的占比,得到分配到该单品的价格,保留2位小数符合金额格式。
示例结果(以客户1购买套餐A,bundle_price=200为例):
| customer_id | bundle_name | product_name | list_price | bundle_price | List_Ratio | Ratio_Bundle_Price |
|---|---|---|---|---|---|---|
| 1 | 套餐A | 产品1 | 100 | 200 | 0.5000 | 100.00 |
| 1 | 套餐A | 产品2 | 80 | 200 | 0.4000 | 80.00 |
| 1 | 套餐A | 产品3 | 20 | 200 | 0.1000 | 20.00 |
内容的提问来源于stack exchange,提问作者Es-Dot
相关产品推荐
相关产品推荐

