SQL查询异常排查:统计符合条件的部门员工数问题
问题分析与修正方案
你的SQL语句目前存在两个关键问题,导致输出不符合预期:
- 子查询未关联部门:你写的子查询没有和外部查询的部门做关联,所以它计算的是全公司1967年以前出生的员工总数,而不是当前部门的对应人数。
- 拼写错误:
empleyee_id应该是employee_id,这个拼写错误可能导致查询报错或者统计结果异常。
下面是修正后的两种可行方案:
方案一:关联子查询
SELECT d.department_id, d.department_name, (SELECT COUNT(e.employee_id) FROM employee e WHERE e.department = d.department_id AND YEAR(e.dateofbirth) < 1967) AS numberofemployeesbefore1967 FROM department d INNER JOIN employee e ON d.department_id = e.department GROUP BY d.department_id, d.department_name HAVING COUNT(e.employee_id) >= 3
这里的子查询通过e.department = d.department_id关联了外部的部门表,确保统计的是当前部门内符合出生年份条件的员工数。同时我们调整了表的别名,让逻辑更清晰,也修正了拼写错误。
方案二:先分组统计再关联
这种写法可读性更强,适合逻辑复杂的场景:
WITH dept_employee_stats AS ( SELECT department, COUNT(*) AS total_employees, SUM(CASE WHEN YEAR(dateofbirth) < 1967 THEN 1 ELSE 0 END) AS numberofemployeesbefore1967 FROM employee GROUP BY department ) SELECT d.department_id, d.department_name, s.numberofemployeesbefore1967 FROM department d INNER JOIN dept_employee_stats s ON d.department_id = s.department WHERE s.total_employees >= 3
我们先在CTE(公共表表达式)里统计每个部门的总员工数和1967年前出生的员工数,再和部门表关联筛选出总员工数≥3的部门,这样逻辑更直观,也避免了子查询的嵌套。
内容的提问来源于stack exchange,提问作者user7856839
相关产品推荐
相关产品推荐

