You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 12:06:03