Как сделать SQL подзапросов? - PullRequest
0 голосов
/ 27 апреля 2020

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

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

SELECT nazwisko, wynagrodzenie, oddzial
FROM pracownicy p
WHERE wynagrodzenie> (SELECT AVG(wynagrodzenie)
FROM pracownicy
WHERE p.oddzial=oddzial);

Однако этот код отображает среднюю заработную плату, но для всех сотрудников:

SELECT nazwisko,
(SELECT AVG(wynagrodzenie) FROM pracownicy
WHERE oddzial = p.oddzial) as srednia
FROM pracownicy p LEFT JOIN oddzialy z ON p. oddzial = z.oddzial;

Ответы [ 2 ]

2 голосов
/ 27 апреля 2020

Если вы хотите фильтровать и отображать среднее вознаграждение, тогда join - лучший вариант, чем подзапрос.

Но здесь я бы просто порекомендовал оконные функции; Вы можете сделать среднее значение окна wynagrodzenie по всем строкам, имеющим одинаковый oddzial, а затем использовать эту информацию для фильтрации и отображения следующим образом:

select nazwisko, wynagrodzenie, oddzial, avg_wynagrodzenie_oddzial
from (
    select p.*, avg(wynagrodzenie) over(partition by oddzial) avg_wynagrodzenie_oddzial
    from pracownicy p
) t 
where wynagrodzenie > avg_wynagrodzenie
0 голосов
/ 27 апреля 2020

Вы можете создать простой запрос на соединение для этого случая, чтобы можно было уменьшить неявный (подзапрос) или явный (отображаемый) размер результата, который получается при постоянном сканировании таблицы.

SELECT nazwisko, wynagrodzenie, p.oddzial, avg_wynagrodzenie
FROM pracownicy p
INNER JOIN (
    SELECT oddzial, AVG(wynagrodzenie) as avg_wynagrodzenie
    FROM pracownicy
    GROUP BY oddzial
) t
ON p.oddizial = t.oddizial
   AND p.wynagrodzenie > t.avg_wynagrodzenie;
...