sql - 基于聚合的更新 - T/SQL

标签 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#Table2 之间的匹配来更新 #Table1:

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
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/

相关文章:

SQL 一步提取每个类别的最大值

sql - 具有相同参数的多个数据库查询的联合

sql - 如果发生错误,此事务是否会回滚

sql - 我下载了 mac os 的 mssql 工具,但它说 "sqlcmd: command not found"

mysql - 将查询从 MySQL 转换为 SQL Server

sql-server - 向 Web 服务连接授予数据​​库权限有哪些良好做法?

sql - PostgreSQL 中的 date_trunc 5 分钟间隔

mysql - 如何在没有聚合和分组的情况下在 MySQL 中查找最多两个项目

sql - 计数最大值每天并发用户 session 数

sql - LEFT JOIN 是否有可能失败,而带有 NOT IN 子句的子查询成功?