53. Найти отделы, где не больше трёх сотрудников
Условие задачи:
Дана таблица EMPLOYEE(ID, NAME, SALARY, DEPARTMENT_ID, CHIEF_ID).
Необходимо вывести идентификаторы отделов, в которых работает не более трёх сотрудников.
Код:
CREATE TABLE EMPLOYEE (
ID INT,
NAME VARCHAR(256),
SALARY INT,
DEPARTMENT_ID INT,
CHIEF_ID INT
);
-- Пример данных:
-- ID | NAME | SALARY | DEPARTMENT_ID | CHIEF_ID
-- ---+-----------+--------+---------------+---------
-- 1 | Иванов | 150 | 1 | NULL
-- 2 | Петров | 250 | 1 | 1
-- 3 | Сидоров | 550 | 1 | 1
-- 4 | Медведев | 350 | 2 | 6
-- 5 | Соколов | 350 | 2 | 6
-- 6 | Рыбников | 150 | 2 | NULL
-- 7 | Арбузов | 450 | 3 | NULL
-- 8 | Орехов | 650 | 3 | 7
-- 9 | Дынин | 50 | 3 | 7
Спойлеры к решению
Подсказки
💡 Сгруппируй сотрудников по
💡 Для каждой группы посчитай количество строк через
💡 Условия на результат агрегирования задаются через
💡 Оставь группы, где количество сотрудников не превышает трёх.
DEPARTMENT_ID.💡 Для каждой группы посчитай количество строк через
COUNT(*).💡 Условия на результат агрегирования задаются через
HAVING, а не WHERE.💡 Оставь группы, где количество сотрудников не превышает трёх.
Решение
SELECT
DEPARTMENT_ID
FROM EMPLOYEE
WHERE DEPARTMENT_ID IS NOT NULL
GROUP BY DEPARTMENT_ID
HAVING COUNT(*) <= 3
ORDER BY DEPARTMENT_ID;
Сначала сотрудники группируются по отделам:
GROUP BY DEPARTMENT_ID
После этого COUNT(*) подсчитывает количество сотрудников в каждом отделе, а:
HAVING COUNT(*) <= 3
оставляет только отделы, где работает не больше трёх человек.
Для приведённых данных результат:
department_id
-------------
1
2
3
Во всех трёх отделах работает ровно по три сотрудника.
Так как в условии дана только таблица EMPLOYEE, запрос может вернуть только отделы, в которых есть хотя бы один сотрудник. Чтобы также получить отделы с нулём сотрудников, потребовалась бы отдельная таблица отделов и LEFT JOIN.