多表分组统计含零值:Equipment、Sections、Users表关联查询问题
解决三表分组统计部门设备与用户总数(含零值)的问题
嘿,我来帮你捋捋这个SQL问题~你原来的语句有几个关键问题,导致没法得到正确结果:
- 主表选了
Equipment,这会直接漏掉没有设备的部门(比如示例里的Manager),我们得把Sections表作为主表,才能保证所有部门都出现在结果里 - GROUP BY的字段写错了,你用了
b.description,但示例里Sections表的字段是Section,应该按b.Section或者b.id分组 - 统计逻辑不对:
COUNT(distinct a.sectionid)会把同一个部门的所有设备都当成1个(因为sectionid相同),应该统计设备的唯一ID;用户数的统计同理,不能用sectionid去重,要统计用户ID
正确的SQL写法(两种方式)
方式一:先预统计各部门的设备数和用户数,再关联Sections表
这种方式逻辑清晰,能避免多表连接导致的重复计数问题:
SELECT s.Section AS SECTION, COALESCE(e.equip_count, 0) AS TOTAL_EQUIPMENT, COALESCE(u.user_count, 0) AS TOTAL_USERS FROM Sections s LEFT JOIN ( SELECT SectionID, COUNT(ID) AS equip_count FROM Equipment GROUP BY SectionID ) e ON s.ID = e.SectionID LEFT JOIN ( SELECT SectionID, COUNT(ID) AS user_count FROM Users GROUP BY SectionID ) u ON s.ID = u.SectionID ORDER BY s.Section;
方式二:直接左连接后统计(注意去重)
如果不想用子查询,也可以直接左连接,但要注意用COUNT(DISTINCT)避免连接产生的重复行影响计数:
SELECT s.Section AS SECTION, COUNT(DISTINCT e.ID) AS TOTAL_EQUIPMENT, COUNT(DISTINCT u.ID) AS TOTAL_USERS FROM Sections s LEFT JOIN Equipment e ON s.ID = e.SectionID LEFT JOIN Users u ON s.ID = u.SectionID GROUP BY s.ID, s.Section ORDER BY s.Section;
结果说明
这两种写法都能得到你期望的结果:
| TOTAL_EQUIPMENT | TOTAL_USERS |
|---|---|
| 1 | 1 |
| 2 | 2 |
| 2 | 1 |
| 0 | 1 |
| 2 | 0 |
这里用COALESCE函数是为了把NULL值转换成0,完美匹配你要求的包含零值的情况。
内容的提问来源于stack exchange,提问作者Stavros B
相关产品推荐
相关产品推荐

