SQL - 更新/计算来自不同行但同一列的值

SQL - Updating / Computing values from different rows but same column

我有一个 table / 数据集,如下所示:

headerid personid accountid value
---------------------------------
123      P1       Account1  5000
123      P1       Account2  1000
123      P2       Account1  3000
123      P2       Account2  500

我想用相同的 personid (p1) 和 headerid (123) 的 account1 和 account2 的差异来更新 accountid = account1。在 运行 脚本之后,结果数据应如下所示:

headerid personid accountid value
---------------------------------
123      P1       Account1  4000
123      P1       Account2  1000
123      P2       Account1  2500
123      P2       Account2  500

需要注意的是我需要用脚本更新所有人的 account1 值。我正在使用 SQL SERVER 2017.

您的示例数据

DROP 
  TABLE IF EXISTS #mytable;
  CREATE TABLE #mytable(
  headerid VARCHAR(50) NOT NULL, 
  personid VARCHAR(50), 
  accountid VARCHAR(50), 
  value int
);
INSERT INTO #mytable(headerid,personid,accountid,value) VALUES 
('123', 'P1', 'Account1', 5000), 
('123', 'P1', 'Account2', 1000), 
('123', 'P2', 'Account1', 3000), 
('123', 'P2', 'Account2', 500);

您应该加入您的table自身以减去数值如下

UPDATE m1
SET    m1.value = m1.value - m2.value
FROM   mytable m1
       JOIN mytable m2
         ON m1.headerid = m2.headerid
            AND m1.personid = m2.personid
            AND m1.accountid = 'Account1'
            AND m2.accountid = 'Account2'  

一种选择是使用条件聚合来确定 accountid 是否等于 Account1,以及 SUM() OVER () window 函数作为 [=14= 分组] 和 personid

WITH t2 AS
(
 SELECT *,
        SUM(CASE WHEN accountid = 'Account1' THEN value ELSE -value END)
           OVER(PARTITION BY headerid, personid) AS new_value
   FROM t
)
UPDATE t2
   SET value = new_value
  FROM t2
 WHERE t2.accountid = 'Account1' 

Demo