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'
我有一个 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'