Выполнить инструкцию SELECT внутри инструкции SELECT? - PullRequest
0 голосов
/ 26 февраля 2020

Я использую базы данных Emp, Dept ... Я хотел бы получить Имя, Зарплата, Дептно и Средняя заработная плата в отделе тех сотрудников, которые зарабатывают больше, чем в среднем по их отделу. Вот что я пытаюсь сделать:

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 ]

2 голосов
/ 26 февраля 2020

Вы бы использовали коррелированный подзапрос:

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
              );

Но на самом деле вы просто использовали бы оконную функцию:

select e.*
from (select e.*, avg(sal) over (partition by deptno) as avg_sal
      from emp e
     ) e
 where sal > avg_sal;
1 голос
/ 26 февраля 2020

Просто избавьтесь от группы.

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
                );
0 голосов
/ 26 февраля 2020

Если вы присоединитесь к подзапросу, вам не нужно будет повторять его.

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
;
...