You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用SQL的SUM OVER PARTITION BY实现SUMIFS逻辑遇阻求助

问题分析与解决方案

你的核心需求是在同一个Order_Id下,将Composite_Parent_SKU等于当前行SKU的所有行的产品成本汇总到对应SKU的行,这和你原来Google Sheets中SUMIFS的逻辑一致,但原SQL的窗口函数分区逻辑没有匹配这个关联关系,导致结果不符合预期。

原SQL的问题

  1. 分区逻辑错误:原SQL按Order_Id, SKU分区,会把SKU=SKU001的两行(第一行和第三行)归为一组,导致汇总结果包含无关行的数据。
  2. 聚合与窗口函数混用:SUM(Product_Cost * Quantity)没有窗口修饰符时是全局聚合,返回的是整个数据集的总和,而非你需要的分组结果。
  3. 条件判断逻辑不匹配需求:没有针对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_IdSKUComposite_Parent_SKUQuantityUnit_CostProduct_CostMy_Result
00001SKU00112055
00001SKU001X213010
00001SKU001SKU001X2210

内容的提问来源于stack exchange,提问作者Irene

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 04:55:13