SQL中SUM结合CASE搭配OVER子句计算累计供应量报错如何解决?
问题根因
你的累计求和代码报错的核心原因是在窗口函数的SUM里嵌套了聚合SUM,违反了SQL的聚合执行逻辑:
你当前的weekly_commits子查询是按Plant, MaterialNumber, Calendar.WeekSort, SnapshotWeek分组的聚合查询,先计算了每周的SupplyQuantity聚合值,这时候要做累计求和,应该直接对已经算好的每周供应值做窗口求和,不应该再嵌套一层SUM(NetQuantity)。
正确修改方案
你可以任选以下一种实现方式:
方案1:直接在聚合子查询中添加窗口函数
把你注释掉的累计求和代码替换为下方内容,无需额外子查询嵌套:
-- 供应累计求和 SUM(SUM(CASE WHEN ReceiptORIssueIndicator = '+' THEN NetQuantity ELSE 0 END)) OVER (PARTITION BY SnapshotWeek, Plant, MaterialNumber ORDER BY Calendar.WeekSort) AS CumulativeSupplyQuantity,
说明:内层SUM是聚合计算单周供应量,外层SUM是窗口函数做累计求和,属于SQL支持的「聚合后直接套窗口函数」的合法语法
方案2:在外层主查询计算累计求和(可读性更高,推荐)
把累计求和逻辑挪到主查询中,直接对已经计算好的周供应量做累加,逻辑更清晰:
SELECT base_query.CommitWeek, base_query.SnapshotWeek, base_query.Plant, base_query.MaterialNumber, weekly_commits.SupplyQuantity, -- 累计供应逻辑写在这里 SUM(weekly_commits.SupplyQuantity) OVER ( PARTITION BY base_query.SnapshotWeek, base_query.Plant, base_query.MaterialNumber ORDER BY base_query.CommitWeek ) AS CumulativeSupplyQuantity, weekly_commits.DemandQuantity -- 后续主查询逻辑保持原有内容不变即可
注意事项
你原来的窗口函数PARTITION规则里多写了ReceiptORIssueIndicator字段,无需添加该字段,你已经通过CASE语句筛选了入库的数量,按快照周、工厂、物料分组就完全符合业务需求。
内容的提问来源于stack exchange,提问作者Maxwell
相关产品推荐
相关产品推荐

