49. Минимальная и максимальная зарплата по отделам среди неуволенных #
Условие задачи:
📌 В базе данных есть две таблицы: “units” – подразделение компании и “employees” – сотрудники компании.
units:
id primary key
name (название unit)
employees:
id primary key
unit_id foreign key -> units::id
salary (зарплата)
fired (флаг уволен true, false)
Необходимо написать sql запрос, который вернет минимальную и максимальную зарплату по каждому отделу среди неуволенных сотрудников. (unit_id)
Спойлеры к решению
Подсказки
💡 Отберитесь по признаку неуволенных:
💡 Сгруппируйтесь по отделу:
💡 Агрегируйте зарплаты:
WHERE fired = false (или = 0, если BOOL хранится как int).💡 Сгруппируйтесь по отделу:
GROUP BY unit_id (и u.name, если нужен человекочитаемый вывод).💡 Агрегируйте зарплаты:
MIN(salary), MAX(salary).Решение
-- Вариант 1: по идентификатору отдела
SELECT
e.unit_id,
MIN(e.salary) AS min_salary,
MAX(e.salary) AS max_salary
FROM employees e
WHERE e.fired = false
GROUP BY e.unit_id;
-- Вариант 2: с названием отдела
SELECT
u.id AS unit_id,
u.name AS unit_name,
MIN(e.salary) AS min_salary,
MAX(e.salary) AS max_salary
FROM units u
JOIN employees e
ON e.unit_id = u.id
AND e.fired = false
GROUP BY u.id, u.name;
Примечание: если хотите показывать все отделы даже без активных сотрудников, используйте
LEFT JOINи переносите условиеfired = falseвON, а не вWHERE:
SELECT
u.id AS unit_id,
u.name AS unit_name,
MIN(e.salary) AS min_salary,
MAX(e.salary) AS max_salary
FROM units u
LEFT JOIN employees e
ON e.unit_id = u.id
AND e.fired = false
GROUP BY u.id, u.name;
-- Для отделов без неуволенных сотрудников min/max будут NULL