SQL: как реализовать агрегатную функцию в подзапросе - PullRequest
1 голос
/ 03 октября 2019

Я работаю над проблемой домашней работы, когда подразделение занимается подзапросами. Это единственная проблема, связанная с агрегатной функцией, и я не знаю, как правильно написать запрос. Это то, о чем спрашивает мой профессор-

"Создайте запрос, чтобы отобразить столбец empno, столбец ename, столбец sal и средние данные о зарплате в отделе emp из таблицы emp. Показать всех сотрудников, которые заработали больше, чем за тот же отделсреднее значение. "

Вот как должен выглядеть правильный вывод из его примера -

EMPN ENAME                  SAL   AVG(SAL)
---- --------------- ---------- ----------
7788 SCOTT                 3000  2916.66667
7839 KING                  5000  1566.66667
7698 BLAKE                 2850        2175
7782 CLARK                 2450  1566.66667
7566 JONES                 2975        2175
7902 FORD                  3000        2175

Я так близок к правильному ответу, что мне нужно использовать 'где-то в моем коде, но я не знаю, где и как. Вот мой код:

SQL> SELECT empno, ename, sal, AVG(sal) AS "DEPT_AVG_SAL"
  2  FROM emp
  3  GROUP BY empno, ename, sal
  4  HAVING sal >
  5     (SELECT AVG(sal)
  6     FROM emp);

Вот вывод, который я получаю. Столбец «sal» правильный, только не «AVG (sal)» -

EMPN ENAME                  SAL DEPT_AVG_SAL
---- --------------- ---------- ------------
7788 SCOTT                 3000         3000
7839 KING                  5000         5000
7698 BLAKE                 2850         2850
7782 CLARK                 2450         2450
7566 JONES                 2975         2975
7902 FORD                  3000         3000

6 rows selected.

Спасибо за чью-либо помощь!

Ответы [ 2 ]

1 голос
/ 03 октября 2019

Вы можете подойти к этому, вычислив среднее окно окладов в отделе в подзапросе, а затем отфильтровать во внешнем запросе сотрудников, зарплата которых выше среднего. Это позволяет избежать использования JOIN и агрегирования:

SELECT *
FROM (
    SELECT
        empno,
        ename,
        sal,
        AVG(sal) OVER(PARTITION BY deptno) dept_avg_sal
    FROM emp
) x
WHERE sal > dept_avg_sal
1 голос
/ 03 октября 2019

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

Основная идея заключается в том, что вам нужно что-то, чтобы получить среднее значение на отдел . Примерно так:

SELECT e.empno, e.ename, e.sal, d.avg_sal
FROM emp e JOIN
     (SELECT e.deptid, AVG(sal) as avg_sal
      FROM emp e
      GROUP BY e.deptid
     ) d
     ON e.dept_id = d.dept_id
WHERE e.sal > d.avg_sal;

В частности, вам не нужен внешний GROUP BY, потому что вы ничего не агрегируете на уровне сотрудника.

...