You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何统计各薪资等级对应的员工数量?

解决薪资等级员工数统计的问题

嘿,我明白你遇到的麻烦了——你的原始查询之所以返回每个等级都是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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:40:20