SQL聚合函数MAX与SUM结合使用:查询总薪资最高的部门列表
SQL查询问题排查与实现
原语句错误点
- 过滤逻辑完全错误:外层WHERE条件里的子查询取的是单个员工的最高薪资,和你计算的部门总薪资
SALARY_SUM维度完全不匹配,正常不可能有相等的情况,所以没有返回结果。另外关联条件w1.ID = s.ID字段对应关系错误,s.ID是DEPARTMENT表的主键,你拿去关联EMPLOYEE表的主键,完全不符合业务逻辑。 - 子查询设计冗余:内层子查询中关联DEPARTMENT表后返回的
w.ID和e.DEPARTMENT_ID值完全一致,属于无效冗余字段。
正确实现方式
方法1:通用兼容写法(适配所有主流关系型数据库)
如果需要同时返回部门ID、部门名称、部门总薪资,且并列最高的部门全部返回,可以用以下写法:
SELECT d.ID DEPARTMENT_ID, d.NAME DEPARTMENT_NAME, SUM(e.SALARY) SALARY_SUM FROM EMPLOYEE e INNER JOIN DEPARTMENT d ON e.DEPARTMENT_ID = d.ID GROUP BY d.ID, d.NAME HAVING SUM(e.SALARY) = ( -- 先计算所有部门的总薪资,再取最大值 SELECT MAX(dept_total) FROM ( SELECT SUM(SALARY) dept_total FROM EMPLOYEE GROUP BY DEPARTMENT_ID ) t )
方法2:窗口函数写法(适配支持窗口函数的数据库,如MySQL8.0+、Oracle、PostgreSQL等)
写法更简洁,自动支持并列排名场景:
SELECT DEPARTMENT_ID, DEPARTMENT_NAME, SALARY_SUM FROM ( SELECT d.ID DEPARTMENT_ID, d.NAME DEPARTMENT_NAME, SUM(e.SALARY) SALARY_SUM, -- 按部门总薪资降序排名,相同薪资排名一致 RANK() OVER(ORDER BY SUM(e.SALARY) DESC) AS salary_rank FROM EMPLOYEE e INNER JOIN DEPARTMENT d ON e.DEPARTMENT_ID = d.ID GROUP BY d.ID, d.NAME ) t WHERE salary_rank = 1
内容的提问来源于stack exchange,提问作者Bohdan Zdor
相关产品推荐
相关产品推荐

