UPDATE基于聚合--T / SQL

时间:2014-01-23 22:03:57

标签: sql sql-server aggregate-functions

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.Col3T1.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语句的集合列表中。

1 个答案:

答案 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;