如何统计各薪资等级对应的员工数量?
解决薪资等级员工数统计的问题
嘿,我明白你遇到的麻烦了——你的原始查询之所以返回每个等级都是42的异常结果,核心原因是没有在EMP和SALGRADE之间建立正确的关联条件,数据库执行了笛卡尔积(把每个员工和每个薪资等级都进行了配对),导致GROUP BY后的COUNT统计的是该等级对应的笛卡尔积行数,而非真正属于该薪资区间的员工数量。
正确的查询方式
我们需要通过员工的薪资(SAL)与薪资等级表的区间(LOSAL到HISAL)来关联两张表,这样才能准确统计每个等级下的员工数。这里提供两种常用写法:
方式1:内连接(仅显示有员工的薪资等级)
SELECT sg.grade, COUNT(e.empno) AS employee_count FROM SALGRADE sg JOIN EMP e ON e.sal BETWEEN sg.losal AND sg.hisal GROUP BY sg.grade ORDER BY sg.grade;
方式2:左连接(显示所有薪资等级,无员工的等级计数为0)
如果你希望展示所有定义好的薪资等级,哪怕该等级下没有员工,就用左连接:
SELECT sg.grade, COUNT(e.empno) AS employee_count FROM SALGRADE sg LEFT JOIN EMP e ON e.sal BETWEEN sg.losal AND sg.hisal GROUP BY sg.grade ORDER BY sg.grade;
结果验证
根据你提供的测试数据,正确的统计结果应该是:
- 等级1:3人(SMITH、JAMES、ADAMS)
- 等级2:3人(WARD、MARTIN、MILLER)
- 等级3:2人(ALLEN、TURNER)
- 等级4:5人(CLARK、BLAKE、JONES、FORD、SCOTT)
- 等级5:1人(KING)
为什么原始查询出错?
当你写FROM emp, salgrade却不指定关联条件时,数据库会生成两张表的笛卡尔积:每一条员工记录都会和每一条薪资等级记录配对。此时GROUP BY grade后,统计的是该等级对应的配对行数,而非真正落在该薪资区间的员工数,这就是你得到异常数值的原因。
内容的提问来源于stack exchange,提问作者Bhagyesh
相关产品推荐
相关产品推荐

