SQL查询无匹配行返回0,补全年龄与日期全量组合的实现问题
你的实现思路存在明显错误,主要问题如下:
- 全量组合拼接逻辑错误:你需要的是11个年龄分组和14个日期的*笛卡尔积(全组合),不能用
FULL OUTER JOIN实现。你当前的写法拼接出来的结果无法覆盖所有年龄+日期的组合,只会保留原表存在的记录、单独的年龄行、单独的日期行,不会自动生成所有可能的组合行,比如某个年龄和某个日期在原表中都没有对应记录的组合行,根本不会出现在结果里。 - 过滤条件限制了结果范围:你最后加了
WHERE a.Age = '80+'的过滤条件,就算前面的逻辑正确,也只能拿到80+这一个年龄分组的14行数据,无法输出11个年龄分组的154行全量结果,如果需要全量结果需要删除该条件,若只是要筛选特定年龄可以保留。 - 字段名匹配问题:你原表的登记人数字段名为
Numbers Registered,代码中引用的是o.Registrations,如果没有提前做字段别名转换,会因为字段不存在报错。
正确实现代码
-- 提取所有不重复年龄分组 SELECT DISTINCT Age INTO #AgesTable FROM #Output -- 提取所有不重复登记日期 SELECT DISTINCT DateRegistered INTO #DatesTable FROM #Output SELECT a.Age, d.DateRegistered, COALESCE(o.[Numbers Registered], 0) AS Registrations -- 交叉连接生成11*14的全量年龄+日期组合 FROM #AgesTable a CROSS JOIN #DatesTable d -- 左连接原表匹配对应记录,没有匹配到的行登记人数补0 LEFT JOIN #Output o ON o.Age = a.Age AND o.DateRegistered = d.DateRegistered -- 如果需要筛选特定年龄再打开下面的注释 -- WHERE a.Age = '80+'
CROSS JOIN会自动生成两个表所有行的两两组合,刚好满足你11×14=154行的需求,再通过LEFT JOIN匹配原表的登记记录,没有匹配到的组合COALESCE会自动把登记人数设为0,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Seamus
相关产品推荐
相关产品推荐

