如何用Running Total更新SQL同表的CumPlanned字段?
解决SCURVE表CumPlanned字段的累计值更新问题
问题分析
你之前尝试的方法存在以下问题:
- 第二个更新语句中,子查询通过
S.id=SCURVE.id仅匹配当前行,导致SUM(DailyPlanned)结果就是当前行的DailyPlanned值,无法得到累计总和。 - 第三个CTE使用了
partition BY id,这会将每一行单独划分为一个分组,求和结果仍然是单条记录的DailyPlanned值,且CTE名称与原表同名会引发引用歧义。
正确解决方案
使用CTE计算正确的累计值,再通过关联更新原表:
WITH RunningTotals AS ( SELECT id, SUM(DailyPlanned) OVER (ORDER BY id) AS RunningTotal FROM SCURVE ) UPDATE SCURVE SET CumPlanned = rt.RunningTotal FROM SCURVE INNER JOIN RunningTotals rt ON SCURVE.id = rt.id;
这个语句的逻辑是:
- 先通过CTE
RunningTotals按id递增顺序计算每一行的累计值RunningTotal - 再将原表与CTE通过
id关联,把累计值更新到CumPlanned字段
注意事项
你的CumPlanned字段定义为decimal(3,0),最多只能存储999的数值。如果300条DailyPlanned的累计值超过999,会出现溢出错误,建议根据实际数据范围调整字段精度,例如改为decimal(6,0)。
内容的提问来源于stack exchange,提问作者Oxley Pilot
相关产品推荐
相关产品推荐

