Используйте LEFT JOIN сотрудников к отделам, GROUP BY и HAVING AVG(salary) > 100000. Но числа в ожидаемом выводе перепутаны: по данным финансовый отдел имеет 112500, а группа без отдела — 130000.
Получить названия подразделений со средней зарплатой выше 100 000
Используйте LEFT JOIN сотрудников к отделам, GROUP BY и HAVING AVG(salary) > 100000. Но числа в ожидаемом выводе перепутаны: по данным финансовый отдел имеет 112500, а группа без отдела — 130000.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Сформируй SQL‑запрос, который вернёт название каждого отдела, где средняя зарплата сотрудников превышает 100 000, а также вычисленное значение этой средней зарплаты. Если у работников нет привязанного отдела (значение department_id равно NULL или NONE) и их средняя зарплата тоже превышает 100 000, такие записи также должны попасть в результат; вместо названия отдела вывести строку "Без отдела".
Ожидаемый вывод для приведённых примеров данных:
department avg_salary
Финансовый отдел 130000
Без отдела 112500
IT-отдел 250000
Даны две таблицы — department и employees — со следующими схемами:
CREATE TABLE department (id serial, name varchar not null);
CREATE TABLE employees (id serial, salary int not null, department_id smallint);
Пример содержимого таблиц:
| id | name |
|---|---|
| 1 | Бухгалтерия |
| 2 | Юридический отдел |
| 3 | IT-отдел |
| 4 | Охрана |
| 5 | Финансовый отдел |
| id | salary | department_id |
|---|---|---|
| 1 | 135000 | 5 |
| 2 | 60000 | 1 |
| 3 | 30000 | 4 |
| 4 | 180000 | NULL |
| 5 | 80000 | 2 |
| 6 | 250000 | 3 |
| 7 | 35000 | 4 |
| 8 | 80000 | NULL |
| 9 | 90000 | 5 |
Ответ
Используйте LEFT JOIN сотрудников к отделам, GROUP BY и HAVING AVG(salary) > 100000. Но числа в ожидаемом выводе перепутаны: по данным финансовый отдел имеет 112500, а группа без отдела — 130000.
Запрос:
SELECT COALESCE(d.name, 'Без отдела') AS department,
AVG(e.salary) AS avg_salary
FROM employees AS e
LEFT JOIN department AS d ON d.id = e.department_id
GROUP BY d.id, d.name
HAVING AVG(e.salary) > 100000;
Финансовый отдел: (135000 + 90000)/2 = 112500; без отдела: (180000 + 80000)/2 = 130000; IT — 250000. SQL использует NULL, не NONE. В рабочей схеме нужны уникальный ключ department.id и внешний ключ employees.department_id, иначе возможны дубли соединения или ссылки на отсутствующие отделы.