Отделы, где число сотрудников не превышает трёх человек

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.