SQL Server如何通过聚合查询获取多部门平均薪资中的最小值
报错原因
SQL Server 不支持在同一查询层级嵌套聚合函数,你写的min(avg(e.salary))属于在聚合结果avg(e.salary)上再执行聚合运算,不符合SQL语法规范,因此触发报错。
解决方案
方案1:TOP 1 + 排序(实现最简单)
先统计所有部门的平均薪资,再按平均薪资升序排序,取第一条即可匹配你的需求:
SELECT TOP 1 d.Dname AS name, AVG(e.salary) AS avg FROM Employee e INNER JOIN Departments d ON d.Dnum = e.dno GROUP BY e.Dno, d.Dname ORDER BY avg ASC
如果存在多个部门平均薪资同为最低的场景,将TOP 1修改为TOP 1 WITH TIES,即可返回所有符合最低薪资要求的部门记录。
方案2:CTE + 窗口函数(灵活度高,适合复杂场景)
如果后续需要扩展统计逻辑,推荐使用窗口函数实现,适配性更强:
WITH dept_avg_salary AS ( SELECT d.Dname AS name, AVG(e.salary) AS avg, -- 按平均薪资升序排名,薪资相同排名一致 RANK() OVER(ORDER BY AVG(e.salary) ASC) AS salary_rank FROM Employee e INNER JOIN Departments d ON d.Dnum = e.dno GROUP BY e.Dno, d.Dname ) SELECT name, avg FROM dept_avg_salary WHERE salary_rank = 1
内容的提问来源于stack exchange,提问作者Mahmoud Diab
相关产品推荐
相关产品推荐

