You need to enable JavaScript to run this app. SQL Server中如何按条件结合GROUP BY使用MAX、SUM实现带日期限制的聚合
优惠活动
大模型
产品
解决方案
定价
更多

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去重,得到每个名称的单行统计结果

原有代码错误点说明

  1. 语法错误:SELET拼写错误应为SELECT,IN后的字符串值需要加单引号,CASE语句缺少END闭合
  2. 逻辑错误:聚合函数MAX()不能直接放在WHERE子句中,WHERE是聚合执行前的行过滤规则,聚合相关条件需要放在子查询或者HAVING子句中
  3. 日期过滤逻辑应该全局前置,两类统计都需要先过滤掉超过指定日期的记录,再处理不同的聚合规则

内容的提问来源于stack exchange,提问作者jh0n37

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 23:51:02