具有多个平均值的子查询

时间:2016-03-10 18:53:46

标签: sql sql-server subquery aggregate-functions

我一直在努力解决类似这样的问题,"找到薪水高于其部门平均工资的所有员工。"我的sql子查询将所有部门的工资混为一谈,以赚取一个平均工资,但我需要一种方法来获得每个部门的平均工资。

我的sql语句看起来像这样。

SELECT EmployeeName
FROM dbo.EMP
WHERE Salary > (
        SELECT AVG(Salary)
        FROM dbo.EMP
        )
GROUP BY DeptNo

2 个答案:

答案 0 :(得分:2)

您可以完成该子查询以使其成为相关子查询:

SELECT EmployeeName
FROM dbo.EMP as t1
WHERE Salary > (
        SELECT AVG(Salary)
        FROM dbo.EMP
        WHERE dbo.EMP.DeptNo = t1.DeptNo
        )

或者你可以使用窗口函数:

SELECT
    EmployeeName,
    CASE WHEN Salary > AVG(Salary) OVER (PARTITION BY DeptNo) Then 'X' END as [HigherThanAverage]
FROM dbo.EMP

这将为您提供所有员工以及他们的工资是否高于其部门平均水平的指标,您可以在以后过滤掉。我想我会把它放在这里,因为随着查询规模的增长,它会为你提供一些选择。

答案 1 :(得分:2)

这是快速变体:

select EmployeeName
from 
dbo.EMP as a
inner join
(
SELECT DeptNo, AVG(Salary) as avgSalary
FROM dbo.EMP
GROUP BY DeptNo
) as b
on (a.DeptNo=b.DeptNo and a.Salary > b.avgSalary)