SQL Server中如何按条件结合GROUP BY使用MAX、SUM实现带日期限制的聚合
实现说明
首先统一过滤所有日期不超过2021-07-01的记录,两类统计规则分开处理后合并结果即可,你原有代码存在语法拼写错误、聚合函数使用位置错误、条件逻辑混淆的问题,以下是可直接运行的实现方案:
方案1:UNION ALL 写法(逻辑清晰,适合新手理解)
-- 处理name1、name2:取最晚日期对应的Value SELECT t.Name, t.Value FROM 你的表名 t INNER JOIN ( SELECT Name, MAX(Date) AS MaxDate FROM 你的表名 WHERE Date <= '2021-07-01' AND Name IN ('name1', 'name2') GROUP BY Name ) t_max ON t.Name = t_max.Name AND t.Date = t_max.MaxDate UNION ALL -- 处理name3、name4:求和所有符合条件的Value SELECT Name, SUM(Value) AS Value FROM 你的表名 WHERE Date <= '2021-07-01' AND Name IN ('name3', 'name4') GROUP BY Name ORDER BY Name
逻辑说明:
- 先通过子查询拿到name1、name2各自符合日期要求的最晚日期,再关联回原表取对应日期的Value
- 第二部分直接对name3、name4的符合条件记录按名称分组求和
- 用UNION ALL合并两部分结果,性能优于单查询嵌套复杂逻辑
方案2:窗口函数写法(更简洁)
SELECT DISTINCT Name, CASE WHEN Name IN ('name1', 'name2') THEN FIRST_VALUE(Value) OVER (PARTITION BY Name ORDER BY Date DESC) WHEN Name IN ('name3', 'name4') THEN SUM(Value) OVER (PARTITION BY Name) END AS Value FROM 你的表名 WHERE Date <= '2021-07-01' ORDER BY Name
逻辑说明:
- 用
FIRST_VALUE开窗按日期倒序排序,取每个name分组的第一个值,就是最晚日期对应的Value - 用
SUM开窗直接统计每个name分组的所有Value总和 - 最后用
DISTINCT去重,得到每个名称的单行统计结果
原有代码错误点说明
- 语法错误:
SELET拼写错误应为SELECT,IN后的字符串值需要加单引号,CASE语句缺少END闭合 - 逻辑错误:聚合函数
MAX()不能直接放在WHERE子句中,WHERE是聚合执行前的行过滤规则,聚合相关条件需要放在子查询或者HAVING子句中 - 日期过滤逻辑应该全局前置,两类统计都需要先过滤掉超过指定日期的记录,再处理不同的聚合规则
内容的提问来源于stack exchange,提问作者jh0n37
相关产品推荐
相关产品推荐

