如何使用T-SQL按日期及月度分组并汇总数据?
问题描述
我有如下结构的表:
| datex | countx |
|---|---|
| 2022-12-04 | 1 |
| 2022-12-03 | 2 |
| 2022-12-02 | 1 |
| 2022-12-01 | 3 |
| 2022-11-30 | 1 |
| 2022-11-29 | 1 |
| 2022-11-28 | 1 |
| 2022-11-27 | 2 |
希望得到如下输出结果:
| datex | count_sum |
|---|---|
| 2022-12 | 4 |
| 2022-12-01 | 3 |
| 2022-11 | 5 |
测试代码如下:
declare @test table ( datex date, countx int ) insert into @test values ('2022-12-04', 1), ('2022-12-03', 2), ('2022-12-02', 1), ('2022-12-01', 3), ('2022-11-30', 1), ('2022-11-29', 1), ('2022-11-28', 1), ('2022-11-27', 2)
解决方案
要实现这个需求,需要将两类数据合并:一类是排除特定日期的月度汇总数据,另一类是单独保留的特定日期数据,用UNION ALL组合结果即可:
-- 第一部分:月度汇总(排除2022-12-01) SELECT FORMAT(datex, 'yyyy-MM') AS datex, SUM(countx) AS count_sum FROM @test WHERE NOT (datex = '2022-12-01') GROUP BY FORMAT(datex, 'yyyy-MM') UNION ALL -- 第二部分:单独保留2022-12-01的数据 SELECT CONVERT(varchar, datex, 23) AS datex, countx AS count_sum FROM @test WHERE datex = '2022-12-01' -- 按时间排序,让结果更规整 ORDER BY CASE WHEN CHARINDEX('-', datex) = 7 THEN CONVERT(date, datex + '-01') ELSE CONVERT(date, datex) END DESC, LEN(datex) ASC
关键说明
- 月度汇总:用
FORMAT(datex, 'yyyy-MM')把日期转成年月格式,对除指定日期外的数据按年月分组求和。 - 单独日期处理:直接筛选出目标日期的记录,保留原日期格式和数值。
- 排序逻辑:通过自定义排序规则,确保结果按时间从新到旧排列,同时让月度数据和单日数据的顺序更合理。
如果需要动态适配不同的特定日期,只要调整WHERE子句的筛选条件即可。
内容的提问来源于stack exchange,提问作者HKN
相关产品推荐
相关产品推荐

