Oracle SQL:同主键行间数值累加更新语句实现
解决方案:用UPDATE实现同ID下指定行的数值累加
当然可以实现这个需求,不管是关联子查询还是窗口函数都能搞定,我给你两种可行的方案:
方法1:关联子查询更新
这种方法直接通过子查询定位每个ID下符合条件的ASB行金额,再更新对应的CON行:
UPDATE your_table t1 SET AMOUNT = t1.AMOUNT + COALESCE( (SELECT t2.AMOUNT FROM your_table t2 WHERE t2.ID = t1.ID AND t2.TYPE = 'ASB' AND t2.TEMP = 'DELETE'), 0 ) WHERE t1.TYPE = 'CON';
- 用
COALESCE是为了处理部分ID没有对应ASB+DELETE行的情况,避免累加NULL导致金额异常,此时会加0保持原金额不变; - 如果一个ID下存在多个符合条件的
ASB行,把子查询里的t2.AMOUNT改成SUM(t2.AMOUNT),就能自动累加所有符合条件的金额。
方法2:窗口函数实现(你关心的方案)
窗口函数可以很方便地按ID分组计算待累加的金额,再通过CTE关联完成更新:
WITH id_amount_cte AS ( SELECT ID, -- 按ID分组,计算符合条件的ASB行总金额 SUM(CASE WHEN TYPE = 'ASB' AND TEMP = 'DELETE' THEN AMOUNT ELSE 0 END) OVER (PARTITION BY ID) AS asb_add_amount FROM your_table ) UPDATE your_table t SET AMOUNT = t.AMOUNT + c.asb_add_amount FROM id_amount_cte c WHERE t.ID = c.ID AND t.TYPE = 'CON';
PARTITION BY ID确保我们只在同一个ID的分组内计算金额;CASE语句精准筛选出TYPE='ASB'且TEMP='DELETE'的行,将它们的金额加总,其他行贡献0;- 这种方法天然支持一个ID下多笔符合条件的ASB行,直接累加总和,逻辑更简洁。
逻辑验证
拿你给出的示例数据测试:
- 当前
CON行的AMOUNT是-2083.26,符合条件的ASB行AMOUNT是1704.03; - 累加后
-2083.26 + 1704.03 = -379.23,和你的预期结果完全匹配。
内容的提问来源于stack exchange,提问作者Manny
相关产品推荐
相关产品推荐

