SQL使用JOIN、COUNT、GROUP BY查询无法返回无员工部门如何解决
问题修正方案
现有代码问题分析
- 主表选择错误:当前以员工表为左表关联部门,无员工的部门不会出现在结果集中,要保留全量部门需要将部门表作为左连接的左表
- 计数逻辑错误:
COUNT(*)会统计所有行,无员工的部门关联员工表后生成的行也会被计为1,需改为统计员工表非空主键的COUNT(p.id),无员工时自动返回0 - 字段冗余:当前查询包含大量员工个人字段,既不符合你需要的部门维度统计需求,也不符合SQL分组查询的语法规范(非聚合、非分组字段不能出现在SELECT子句中)
正确查询代码
SELECT d.id AS 部门id, d.name AS 部门名称, l.id AS 地点id, l.name AS 地点名称, COUNT(p.id) AS 对应部门员工数量 FROM department d LEFT JOIN personnel p ON d.id = p.departmentID LEFT JOIN location l ON d.locationID = l.id GROUP BY d.id, d.name, l.id, l.name
逻辑说明
- 以部门表为左表,依次左连员工表、地点表,保证所有部门(包括无员工的部门)都会被保留
COUNT(p.id)只会统计员工ID不为空的记录,无员工的部门自动返回0- GROUP BY包含所有非聚合字段,符合SQL语法标准,适配所有数据库类型
内容的提问来源于stack exchange,提问作者jimmy118
相关产品推荐
相关产品推荐

