Среднюю зарплату по должности вычислите через AVG OVER, затем задайте специальный порядок CASE: JAMES первым, FORD последним, остальные по ENAME DESC.
SQL: средняя зарплата и порядок сотрудников через CASE
Среднюю зарплату по должности вычислите через AVG OVER, затем задайте специальный порядок CASE: JAMES первым, FORD последним, остальные по ENAME DESC.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
-- Даны две таблицы EMP - список сотрудников и зарплат, DEPT - список подразделений -- 1) Написать запрос, возвращающий имя (ENAME), подразделение (DNAME), должность (JOB) -- и на сколько зарплата работника (SAL) отличается от средней для его должности. -- 2) Отсортировать полученный результат так, чтобы сотрудник с именем JAMES был на первой строчке, -- FORD на последней, а все остальные сотрудники отсортированы по имени в обратном алфавитном порядке.
Ответ
Среднюю зарплату по должности вычислите через AVG OVER, затем задайте специальный порядок CASE: JAMES первым, FORD последним, остальные по ENAME DESC.
Предположим, таблицы связаны по DEPTNO, а DEPTNO уникален в DEPT:
SELECT e.ename, d.dname, e.job,
e.sal - AVG(e.sal) OVER (PARTITION BY e.job) AS salary_difference
FROM emp e
LEFT JOIN dept d ON d.deptno = e.deptno
ORDER BY CASE
WHEN e.ename = 'JAMES' THEN 0
WHEN e.ename = 'FORD' THEN 2
ELSE 1
END,
e.ename DESC;
Положительная разница означает зарплату выше среднего по должности. LEFT JOIN сохраняет сотрудников без найденного отдела. Если имена повторяются, все JAMES и FORD попадут в соответствующие группы; для однозначного порядка добавьте уникальный идентификатор.