合并两个含相同日期字段的SELECT查询及去除重复日期记录的方法
重复原因
你使用UNION拼接了两个结果集:一个是全月日期+0任务的集合,一个是有任务日期+实际统计数的集合。同一日期会生成两条字段值不完全一致的记录,UNION只能去重完全相同的行,因此无法合并这两条记录,导致出现重复行。
解决方案
改用左关联(LEFT JOIN)逻辑,以生成的全月日期序列作为左表,关联聚合后的任务统计结果,无任务的日期自动补0即可,修改后代码如下:
Declare @year int = 2021, @month int = 8; WITH numbers as ( Select 1 as value UNION ALL Select value +1 from numbers where value + 1 <= Day(EOMONTH(datefromparts(@year, @month, 1))) ) SELECT datefromparts(@year, @month, numbers.value) AS Datum, ISNULL(t.Tasks, 0) AS Tasks FROM numbers LEFT JOIN ( SELECT CONVERT(date, added_d) AS Datum, COUNT(*) AS Tasks FROM Crm.Task WHERE YEAR(added_d) = @year AND MONTH(added_d) = @month GROUP BY CONVERT(date, added_d) ) t ON datefromparts(@year, @month, numbers.value) = t.Datum
逻辑说明
- 保留原CTE生成当月所有日期序列的逻辑
- 把任务统计结果作为子查询,和日期序列做左关联
- 用
ISNULL函数将无任务日期的空统计值替换为0 - 原代码里硬编码的年份月份替换为变量,适配动态查询需求
内容的提问来源于stack exchange,提问作者Urban
相关产品推荐
相关产品推荐

