使用SQL的SUM OVER PARTITION BY实现SUMIFS逻辑遇阻求助
问题分析与解决方案
你的核心需求是在同一个Order_Id下,将Composite_Parent_SKU等于当前行SKU的所有行的产品成本汇总到对应SKU的行,这和你原来Google Sheets中SUMIFS的逻辑一致,但原SQL的窗口函数分区逻辑没有匹配这个关联关系,导致结果不符合预期。
原SQL的问题
- 分区逻辑错误:原SQL按
Order_Id, SKU分区,会把SKU=SKU001的两行(第一行和第三行)归为一组,导致汇总结果包含无关行的数据。 - 聚合与窗口函数混用:
SUM(Product_Cost * Quantity)没有窗口修饰符时是全局聚合,返回的是整个数据集的总和,而非你需要的分组结果。 - 条件判断逻辑不匹配需求:没有针对
Composite_Parent_SKU与SKU的关联关系做处理,无法将父SKU对应的成本映射到目标行。
修正后的SQL代码
根据你的期望结果,以下代码实现了需求(若需汇总Product_Cost*Quantity,可修改CTE中的SUM部分):
WITH parent_costs AS ( -- 预计算每个Order_Id下,各Composite_Parent_SKU对应的总产品成本 SELECT Order_Id, Composite_Parent_SKU AS target_sku, SUM(Product_Cost) AS total_cost -- 若需计算Product_Cost*Quantity,改为SUM(Product_Cost * Quantity) FROM your_table_name WHERE Composite_Parent_SKU IS NOT NULL AND Composite_Parent_SKU != '' GROUP BY Order_Id, Composite_Parent_SKU ) SELECT t.Order_Id, t.SKU, t.Composite_Parent_SKU, t.Quantity, t.Unit_Cost, t.Product_Cost, CASE -- 有明确Product_Cost和Unit_Cost的行,直接返回自身产品成本 WHEN t.Product_Cost IS NOT NULL AND t.Product_Cost > 0 AND t.Unit_Cost > 0 THEN t.Product_Cost -- 若需计算单行列总成本,改为t.Product_Cost * t.Quantity -- 有Unit_Cost但无Product_Cost的行,关联取对应父SKU的汇总成本 WHEN t.Unit_Cost > 0 AND (t.Product_Cost IS NULL OR t.Product_Cost = 0) THEN pc.total_cost -- 作为父SKU的行(Composite_Parent_SKU不为空),返回空值 ELSE NULL END AS My_Result FROM your_table_name t LEFT JOIN parent_costs pc ON t.Order_Id = pc.Order_Id AND t.SKU = pc.target_sku ORDER BY t.Order_Id, t.SKU;
结果验证
执行上述SQL后将得到你期望的结果:
| Order_Id | SKU | Composite_Parent_SKU | Quantity | Unit_Cost | Product_Cost | My_Result |
|---|---|---|---|---|---|---|
| 00001 | SKU001 | 1 | 20 | 5 | 5 | |
| 00001 | SKU001X2 | 1 | 30 | 10 | ||
| 00001 | SKU001 | SKU001X2 | 2 | 10 |
内容的提问来源于stack exchange,提问作者Irene
相关产品推荐
相关产品推荐

