在SELECT语句内执行SELECT语句?

时间:2020-02-26 18:53:15

标签: sql sql-server tsql select

我正在使用Emp,Dept ...数据库。我想获得那些收入高于其部门平均水平的员工的姓名,工资,Deptno和平均工资。因此,这就是我想要做的:

SELECT e.Ename, e.Sal, e.Deptno
  , (
    SELECT AVG(Sal) 
    FROM Emp b 
    WHERE b.Deptno = e.Deptno
    GROUP BY Deptno
  ) AS 'Average Salary'
FROM Emp e
WHERE e.Sal > (
  SELECT AVG(b.Sal)
  FROM Emp b
  WHERE b.Deptno = e.Deptno
  GROUP BY Deptno
);

我不能使用AVG(Sal),因为它会给出员工而不是其工作部门的平均工资。

3 个答案:

答案 0 :(得分:2)

您将使用相关子查询:

SELECT e.Ename, e.Sal, e.Deptno,
       (SELECT AVG(e2.Sal) 
        FROM Emp e2
        WHERE e2.Deptno = e.Deptno
       ) AS [Average Salary]
FROM Emp e
WHERE e.Sal > (SELECT AVG(e2.Sal)
               FROM Emp e2
               WHERE e2.Deptno = e.Deptno
              );

但是实际上,您只需要使用window函数:

select e.*
from (select e.*, avg(sal) over (partition by deptno) as avg_sal
      from emp e
     ) e
 where sal > avg_sal;

答案 1 :(得分:1)

只需摆脱分组依据。

SELECT e.Ename, e.Sal, e.Deptno, (SELECT AVG(Sal) 
                                   FROM Emp b 
                                   WHERE b.Deptno = e.Deptno
                                   ) AS 'Average Salary'
FROM Emp e
WHERE e.Sal > (SELECT AVG(b.Sal)
                FROM Emp b
                WHERE b.Deptno = e.Deptno
                );

答案 2 :(得分:0)

如果您加入子查询,则无需重复。

SELECT e.Ename, e.Sal, e.Deptno, dAvgs.avgSal AS 'Average Salary'
FROM Emp AS e
INNER JOIN (
   SELECT Deptno, AVG(b.Sal) AS avgSal
   FROM Emp b
   GROUP BY Deptno
) AS dAvgs
ON e.Deptno = dAvgs.Deptno AND e.Sal > dAvgs.avgSal
;
相关问题