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

多表分组统计含零值: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_EQUIPMENTTOTAL_USERS
11
22
21
01
20

这里用COALESCE函数是为了把NULL值转换成0,完美匹配你要求的包含零值的情况。

内容的提问来源于stack exchange,提问作者Stavros B

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:44:12