SQL关联表查询:生成含NULL值的全量站点每日出勤统计数据
解决方案
要实现每个站点覆盖6个月所有日期、缺失出勤时显示NULL的需求,核心是先构建站点+日期的全量笛卡尔积,再通过左连接关联出勤数据,具体SQL语句如下:
-- 1. 获取所有唯一站点,与日期表交叉连接生成全量站点-日期组合 -- 2. 左连接出勤表,匹配对应站点和日期的出勤数据 SELECT s.SiteName, d.Date, sd.Count AS AttendanceCount FROM (SELECT DISTINCT SiteName FROM #SiteData) s CROSS JOIN #Data d LEFT JOIN #SiteData sd ON s.SiteName = sd.SiteName AND d.Date = sd.Date ORDER BY s.SiteName, d.Date;
关键逻辑说明
- CROSS JOIN:通过唯一站点列表和日期表的交叉连接,生成每个站点对应6个月中每一天的基础记录,确保不会遗漏任何日期与站点的组合。
- LEFT JOIN:以全量组合为基础左连接出勤表,即使某站点某天无出勤数据,也会保留这条记录,且
AttendanceCount字段自动填充为NULL。 - DISTINCT SiteName:避免#SiteData中存在重复站点时,交叉连接生成冗余记录。
如果你的临时表字段名与示例不符(比如站点字段不是SiteName、日期字段不是Date),自行替换为实际字段名即可。
内容的提问来源于stack exchange,提问作者AndrewK
相关产品推荐
相关产品推荐

