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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 18:34:06