Посчитать сотрудников по отделам, включая пустые
Таблицы Departments(id, name) и Employee(id, name, dept_id). Верните имя каждого отдела и число его сотрудников.
Требования:
- в результат должен попасть каждый отдел, включая отделы без сотрудников
- отдел без сотрудников должен показывать счёт
0, а не1 - учтите граничный случай, когда соединение даёт NULL-строку сотрудника для пустого отдела
SELECT d.name AS department, /* счёт здесь */ AS employee_count
FROM Departments d
-- ваш запрос здесь
Напишите запрос.
LEFT JOIN Employee к Departments, чтобы выжил каждый отдел, GROUP BY d.id, d.name и COUNT(e.id) — счёт по столбцу сотрудника даёт 0 для пустых отделов, тогда как COUNT(*) посчитал бы единственную NULL-строку соединения как 1. INNER JOIN отбросил бы пустые отделы.
- ✗Использовать
COUNT(*)и показывать1для пустых отделов вместо0 - ✗Использовать
INNER JOIN, отбрасывающий отделы без сотрудников - ✗Считать ключ отдела вместо столбца сотрудника
- →Почему
COUNT(e.id)возвращает0, аCOUNT(*)—1для пустого отдела? - →Какая таблица должна быть слева в
LEFT JOIN, чтобы это работало?
Задача
Посчитать число сотрудников по отделам, включая отделы без сотрудников.
SELECT d.name AS department, COUNT(e.id) AS employee_count
FROM Departments d
LEFT JOIN Employee e ON e.dept_id = d.id
GROUP BY d.id, d.name
ORDER BY employee_count DESC;
Как это работает
Чтобы в результат попали и пустые отделы, ведущей таблицей делают Departments и присоединяют Employee через LEFT JOIN. Отдел без сотрудников всё равно даст одну строку — но со столбцами Employee, равными NULL.
Ключевой момент — COUNT(e.id), а не COUNT(*):
COUNT(e.id)считает только не-NULLзначения столбца сотрудника → для пустого отдела это0;COUNT(*)считает строки → для пустого отдела это была бы одна NULL-строка, то есть ошибочная1.
⚠️ INNER JOIN здесь не годится: он отбросил бы отделы без совпадений, и они вообще не попали бы в результат.