CREATE TABLE #Table1
(
ID INT Identity (1,1), Col1 varchar(10),
Col2 DateTime2(7), Col3 INT, COl4 INT
);
INSERT INTO #Table1 VALUES
('Part1','2014-01-23 22:00:00.0000000', NULL, NULL),
('Part2','2014-01-23 23:00:00.0000000', NULL, NULL),
('Part3','2014-01-23 23:00:00.0000000', NULL, NULL),
('Part3','2014-01-23 23:30:00.0000000', NULL, NULL);
CREATE TABLE #Table2
(
ID INT Identity (1,1), C1 varchar(10), C2 varchar(10),
C3 bit, C4 Varchar(10), C5 DateTime2(7)
);
INSERT INTO #Table2 VALUES
('One', 'First', 1, 'Part1','2014-01-23 22:00:00.0000000'),
('Two', 'Second', 1, 'Part1','2014-01-23 22:00:00.0000000'),
('Three', 'Third', 0, 'Part1','2014-01-23 22:00:00.0000000'),
('Four', 'Fourth', 1, 'Part2','2014-01-23 23:00:00.0000000'),
('Five', 'Fifth', 0, 'Part2','2014-01-23 23:00:00.0000000'),
('Six', 'Sixth', 1, 'Part3','2014-01-23 23:00:00.0000000'),
('Seven', 'Seventh', 1, 'Part3','2014-01-23 23:00:00.0000000'),
('Eight', 'Eight', 0, 'Part3','2014-01-23 23:30:00.0000000');
我想根据以下条件下 #Table1
和 #Table2
之间的匹配来更新 #Table1
:
ON T1.Col1 = T2.C4 AND T1.Col2 = T2.C5
并聚合 T2.C3
值以更新 T1.Col3
和 T1.Col4
的值,其中:
T1.Col3 = COUNT(T2.C3 WHERE T2.C3 = 1)
T1.Col4 = COUNT(T2.C3 WHERE T2.C3 = 0)
更新后#Table1
的预期内容:
ID Col1 Col2 Col3 Col4
-- ----- ---------------- ---- ----
1 Part1 2014-01-23 22:00 2 1
2 Part2 2014-01-23 23:00 1 1
3 Part3 2014-01-23 23:00 2 0
4 Part3 2014-01-23 23:30 0 1
我尝试更新失败:
UPDATE T1
SET T1.Col3 = SUM(CASE WHEN T2.C3 = 1 THEN 1 ELSE 0 END)
,T1.Col4 = SUM(CASE WHEN T2.C3 = 0 THEN 1 ELSE 0 END)
FROM #Table1 T1 INNER JOIN #Table2 T2
ON T1.Col1 = T2.C4 AND T1.Col2 = T2.C5
此操作失败:
Msg 157, Level 15, State 1, Line 33
An aggregate may not appear in the set list of an UPDATE statement.
最佳答案
您不能像这样在 UPDATE 列表中使用聚合(如错误消息所示)。
但是,您可以这样做:
;WITH x(C4,C5,C3Yes,C3No) AS
(
SELECT C4, C5,
COUNT(CASE WHEN C3 = 1 THEN 1 END),
COUNT(CASE WHEN C3 = 0 THEN 1 END)
FROM #Table2 GROUP BY C4, C5
)
UPDATE t1 SET Col3 = x.C3Yes, Col4 = x.C3No
FROM #Table1 AS t1
INNER JOIN x
ON x.C4 = t1.Col1 AND x.C5 = t1.Col2;
关于sql - 基于聚合的更新 - T/SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21320284/