如何修正SQL查询以获取各部门员工平均薪资(含无员工部门)
问题修正方案
核心问题分析
原查询存在两个关键问题:
- 用内连接(JOIN):仅返回两表匹配的部门,丢失了无员工的Sales部门
- 用窗口函数
avg() over():为每个员工行重复输出部门平均薪资,导致结果行数等于员工数而非部门数
修正后的SQL语句
SELECT d.department_id, d.department_name, -- 无员工时显示0,也可替换为'无员工'等自定义内容 ROUND(NVL(AVG(e.salary), 0)) avg_sal FROM departments d LEFT JOIN employees e ON d.department_id = e.department_id GROUP BY d.department_id, d.department_name ORDER BY d.department_id;
修正说明
- LEFT JOIN:以部门表为主表,保留所有部门记录,哪怕对应员工表无匹配数据
- GROUP BY:按部门分组,每个部门仅生成一行结果,配合聚合函数
AVG()计算平均薪资 - NVL():处理无员工部门的平均薪资,将
AVG()返回的NULL转换为0(可按需调整显示内容) - ORDER BY:按部门ID排序,让结果更规整
正确查询结果
DEPARTMENT_ID DEPARTMENT_NAME AVG_SAL 1 IT 76111 2 DBA 133333 3 Sales 0
内容的提问来源于stack exchange,提问作者Pugzly
相关产品推荐
相关产品推荐

