如何在SQL中为不存在的类型值显示零行统计结果
解决方案:补全缺失Type维度并填充0值
要实现展示Type 1至Type 6的全部统计结果,缺失的Type 3、Type 5统计值填0,可通过构建完整维度组合再关联原数据的方式实现:
-- 生成完整的维度组合(角色、区域、所有Type),再关联原数据填充统计值 select full_dim.TE, full_dim.REG, full_dim.ATTAIN, coalesce(a.total, 0) as total from ( -- 获取所有唯一的角色和区域 select distinct TE, REG from (values ('Account Exec','US','Type 1',12), ('Account Exec','US','Type 2',34), ('Account Exec','US','Type 4',24), ('Account Exec','US','Type 6',32), ('Account Exec','Europe','Type 1',35), ('Account Exec','Europe','Type 4',43), ('Account Exec','Europe','Type 6',45), ('Account Exec','Others','Type 1',23), ('Account Exec','Others','Type 4',23), ('Account Exec','Others','Type 6',54) ) a(TE,REG,ATTAIN,total) ) base_dim -- 交叉连接生成Type 1到Type 6的全量维度 cross join ( values ('Type 1'), ('Type 2'), ('Type 3'), ('Type 4'), ('Type 5'), ('Type 6') ) types(ATTAIN) as full_dim -- 左连接原数据,匹配对应统计值 left join ( values ('Account Exec','US','Type 1',12), ('Account Exec','US','Type 2',34), ('Account Exec','US','Type 4',24), ('Account Exec','US','Type 6',32), ('Account Exec','Europe','Type 1',35), ('Account Exec','Europe','Type 4',43), ('Account Exec','Europe','Type 6',45), ('Account Exec','Others','Type 1',23), ('Account Exec','Others','Type 4',23), ('Account Exec','Others','Type 6',54) ) a(TE,REG,ATTAIN,total) on full_dim.TE = a.TE and full_dim.REG = a.REG and full_dim.ATTAIN = a.ATTAIN order by full_dim.TE, full_dim.REG, full_dim.ATTAIN;
关键逻辑说明
- 构建完整维度:通过
distinct获取原数据中所有的角色(TE)和区域(REG),再与Type 1至Type 6的固定列表交叉连接,得到所有需要展示的维度组合。 - 填充0值:使用
left join关联原数据,未匹配到的统计值会返回null,通过coalesce(null, 0)将其替换为0。 - 排序输出:最后按角色、区域、Type排序,保证结果顺序符合预期。
内容的提问来源于stack exchange,提问作者timy
相关产品推荐
相关产品推荐

