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
和#Table1
之间的匹配更新#Table2
:
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
聚合可能不会出现在UPDATE语句的集合列表中。
答案 0 :(得分:2)
您不能在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;