Oracle SQL Developer:如何实现行值累计求和至指定列?
Oracle实现C2列累计求和并填入C3列的方案
嗨,这个需求用Oracle的窗口函数就能完美解决!我分两种常见场景给你说明:
一、直接查询出累计求和结果
如果你只是想查看累计后的结果,不需要修改表数据,用SUM() OVER()窗口函数是最简便的方式:
SELECT S.No, C1, C2, SUM(C2) OVER(ORDER BY S.No) AS C3 FROM 你的表名;
原理说明
SUM(C2) OVER(ORDER BY S.No) 会按照S.No的顺序,逐行计算C2的累计总和。对应你的示例:
- 第1行:仅计算当前行C2的值,结果为10
- 第2行:10+20=30
- 第3行:10+20+30=60
- 第4行:10+20+30+40=100
完全匹配你期望的结果。
二、更新表中的C3列
如果需要把累计值永久写入C3列,推荐用MERGE语句(效率更高),或者关联子查询的UPDATE语句:
方式1:使用MERGE(推荐大表场景)
MERGE INTO 你的表名 t USING ( SELECT S.No, SUM(C2) OVER(ORDER BY S.No) AS new_C3 FROM 你的表名 ) src ON (t.S.No = src.S.No) WHEN MATCHED THEN UPDATE SET t.C3 = src.new_C3;
方式2:使用UPDATE(适合小表)
UPDATE 你的表名 t SET C3 = ( SELECT SUM(C2) FROM 你的表名 WHERE S.No <= t.S.No );
注意事项
- 必须指定
ORDER BY S.No:Oracle表本身是无序的,只有明确排序字段,累计求和的顺序才会和你预期一致。 - 如果
S.No存在重复值,需要根据实际业务调整窗口函数的分区逻辑(比如SUM(C2) OVER(PARTITION BY 分组字段 ORDER BY S.No)),不过从你的示例看S.No是唯一的,所以无需额外处理。
内容的提问来源于stack exchange,提问作者surya srujana
相关产品推荐
相关产品推荐

