SQL日期范围查询分组名称显示NULL,需修正匹配预期结果
问题:获取指定日期范围内包含所有分组的完整记录
原始数据表
| 日期 | 分组名称 | 员工 |
|---|---|---|
| 2024-11-01 | Group A | John |
| 2024-11-01 | Group A | Rachel |
| 2024-11-01 | Group B | Mary |
| 2024-11-02 | Group A | John |
| 2024-11-03 | Group A | Rachel |
| 2024-11-03 | Group B | Mary |
| 2024-11-05 | Group A | John |
| 2024-11-05 | Group B | Mary |
原查询语句
with scheduler as ( select convert(datetime, '2024-11-05 00:00:00', 120) as 'dt' -- end date union all select dateadd(DAY, -1, dt) from scheduler where dateadd(dd, -1, dt) >= convert(datetime, '2024-11-01 00:00:00', 120) -- start date ) select convert(date, a.dt) as 'date', b.group_name, b.employee from scheduler a left join tbl_a b order by a.dt, b.group_name;
当前查询结果
| 日期 | 分组名称 | 员工 |
|---|---|---|
| 2024-11-01 | Group A | John |
| 2024-11-01 | Group A | Rachel |
| 2024-11-01 | Group B | Mary |
| 2024-11-02 | Group A | John |
| 2024-11-03 | Group A | Rachel |
| 2024-11-03 | Group B | Mary |
| 2024-11-04 | NULL | NULL |
| 2024-11-05 | Group A | John |
| 2024-11-05 | Group B | Mary |
期望结果
| 日期 | 分组名称 | 员工 |
|---|---|---|
| 2024-11-01 | Group A | John |
| 2024-11-01 | Group A | Rachel |
| 2024-11-01 | Group B | Mary |
| 2024-11-02 | Group A | John |
| 2024-11-02 | Group B | NULL |
| 2024-11-03 | Group A | Rachel |
| 2024-11-03 | Group B | Mary |
| 2024-11-04 | Group A | NULL |
| 2024-11-04 | Group B | NULL |
| 2024-11-05 | Group A | John |
| 2024-11-05 | Group B | Mary |
修正后的查询语句
with scheduler as ( select convert(datetime, '2024-11-05 00:00:00', 120) as 'dt' -- end date union all select dateadd(DAY, -1, dt) from scheduler where dateadd(dd, -1, dt) >= convert(datetime, '2024-11-01 00:00:00', 120) -- start date ), groups as ( select distinct group_name from tbl_a -- 获取所有唯一分组 ) select convert(date, s.dt) as 'date', g.group_name, t.employee from scheduler s cross join groups g -- 生成日期与分组的全组合 left join tbl_a t on convert(date, s.dt) = t.日期 and g.group_name = t.group_name -- 按日期+分组匹配原表数据 order by s.dt, g.group_name;
关键调整说明
- 新增
groups公共表表达式,提取所有唯一分组,确保不会遗漏任何分组信息 - 使用
cross join生成日期范围与所有分组的笛卡尔积,保证每个日期下每个分组都有一行记录 - 左连接原表时同时匹配日期和分组字段,精准关联对应数据,无匹配数据时员工字段自动显示
NULL
内容的提问来源于stack exchange,提问作者Rose Gold
相关产品推荐
相关产品推荐

