SQL连接缺失值统计:如何查询包含无数据分类的计数?
解决SQL查询返回全部分组-用户组合并统计数量的问题
你当前的查询是从Table2出发做左连接,所以只能拿到Table2中实际存在关联关系的分组和用户组合。要实现所有分组与所有用户的全量组合,无关联时数量显示0的需求,需要先构建出所有可能的分组-用户配对,再关联统计数据。
实现思路
- 先提取
Table2中所有不重复的分组名称,得到完整的分组列表 - 将分组列表与
Table1做交叉连接(CROSS JOIN),生成每个分组对应每个用户的全量组合 - 左连接回
Table2,匹配对应的GUID记录,最后统计每个组合的唯一GUID数量(无匹配时自动返回0)
最终查询语句
SELECT G.GroupName, A.NAME, COUNT(DISTINCT B.GUID) AS Quantity FROM (SELECT DISTINCT GroupName FROM Table2) G CROSS JOIN Table1 A LEFT JOIN Table2 B ON G.GroupName = B.GroupName AND A.ID = B.ID GROUP BY G.GroupName, A.NAME ORDER BY G.GroupName, A.NAME;
语句说明
(SELECT DISTINCT GroupName FROM Table2) G:单独提取不重复的分组,避免后续交叉连接时出现重复分组CROSS JOIN Table1 A:生成分组与用户的笛卡尔积,确保每个分组都能对应到所有用户LEFT JOIN Table2 B ...:保留所有分组-用户组合,仅关联存在的GUID记录COUNT(DISTINCT B.GUID):统计唯一GUID的数量,当没有匹配记录时,B.GUID为NULL,COUNT会返回0,正好符合你的需求ORDER BY:让结果按分组和用户名称排序,和你期望的输出格式一致
执行这个查询后,就能得到你想要的结果:
GroupName | NAME | Quantity ----------+------+--------- GroupA | AAA | 2 GroupA | BBB | 3 GroupA | CCC | 0 GroupA | DDD | 0 GroupB | AAA | 0 GroupB | BBB | 3 GroupB | CCC | 2 GroupB | DDD | 0
内容的提问来源于stack exchange,提问作者Rudeman
相关产品推荐
相关产品推荐

