使用相同的主键将值从一行添加到另一行 - Oracle SQL

Posted

技术标签:

【中文标题】使用相同的主键将值从一行添加到另一行 - Oracle SQL【英文标题】:Add Value from one Row to another Row with Same Primary Key- Oracle SQL 【发布时间】:2020-02-28 15:45:40 【问题描述】:

我想创建一个更新语句,将一行中的值添加到具有相同 ID 字段的另一行的值中。基本上只要 TYPE = 'ASB' 和 TEMP = 'DELETE' 我想将 AMOUNT 值添加到 TYPE = 'CON' 的 AMOUNT 中。

必须为每个 ID 执行此操作。 COMBINE 字段可以用作每一行的唯一标识符。也许是一个窗口功能?非常感谢任何帮助!

Current Result:
ID          TYPE         AMOUNT        COMBINE      TEMP
0432        CMP         12828.77      0432CMP   
0432        CON         -2083.26      0432CON   
0432        ASB         1704.03       0430ASB      DELETE

Expected Result:
ID          TYPE         AMOUNT        COMBINE      TEMP
0432        CMP         12828.77      0432CMP   
0432        CON         -379.23       0432CON   
0432        ASB         1704.03       0432ASB      DELETE

【问题讨论】:

【参考方案1】:

您可以使用MERGE声明如下:

MERGE INTO YOUR_TABLE TRG USING 
(
    SELECT ID, SUM(AMOUNT) AS AMOUNT
    FROM YOUR_TABLE
    WHERE TYPE = 'ASB' AND TEMP = 'DELETE'
    GROUP BY ID
) SRC 
ON ( SRC.ID = TRG.ID AND TRG.TYPE = 'CON' )
WHEN MATCHED THEN 
UPDATE SET TRG.AMOUNT = TRG.AMOUNT + SRC.AMOUNT;

干杯!!

【讨论】:

【参考方案2】:

update 应该这样做:

update t
    set amount = amount +
                 (select coalesce(sum(t2.amount), 0)
                  from t t2
                  where t2.id = t.id and t2.type = 'ASB' and t2.temp = 'DELETE'
                 )
    where t.type = 'CON' and
          exists (select 1
                  from t t2
                  where t2.id = t.id and t2.type = 'ASB' and t2.temp = 'DELETE'
                 );

【讨论】:

以上是关于使用相同的主键将值从一行添加到另一行 - Oracle SQL的主要内容,如果未能解决你的问题,请参考以下文章

基于主键将两个表从BigQuery导出到CSV

根据 postgresQL 中的时间戳将值从一个表映射到另一个表

将一行中的金额添加到具有相同主键的不同行中的金额

删除数据库现有记录,同时将值从一行分配给具有唯一值的另一行

PySimpleGui:如何将值从一个列表框添加到另一个列表框

将值从一项活动更新到另一项活动