如何查询所有经理员工组合的注册记录数,未注册组合显示为0
SQL查询问题解决
原有查询的问题
- 你用了
UNION ALL直接拼接两个结果集,本质是把登记过的计数记录和全量20种组合记录直接拼在一起,自然会出现重复:已登记的组合会同时出现带计数、带null的两条记录,不符合需求 - 第二个子查询存在语法错误:你给manager、employee表定义的别名是m、e,但是字段前用了不存在的s、i作为别名,运行时会直接报错
- 没有做匹配关联,无法将未登记组合的null计数转为0
正确写法
SELECT t.manager, t.employee, COUNT(r.manager) AS registration_count FROM -- 先拿到全部20种有效经理员工组合 (SELECT m.manager, e.employee FROM manager m INNER JOIN employee e ON m.id = e.manager_id) t -- 左关联登记记录表,匹配到就有值,没匹配到就是null LEFT JOIN registration r ON t.manager = r.manager AND t.employee = r.employee GROUP BY t.manager, t.employee
逻辑说明
- 内层子查询先关联manager和employee表,拿到你需要的全部20种有效组合作为主表,保证不会漏组合
- 用左连接关联registration表,只有经理、员工两个字段都匹配上才会带出登记记录,没登记的组合对应的r表字段全为null
- 计数时统计r表的非空字段,COUNT函数会自动忽略null值,未登记的组合统计结果就会返回0,刚好符合你的要求
内容的提问来源于stack exchange,提问作者Chandana Avadhani
相关产品推荐
相关产品推荐

