MiddleКодЧастоЕщё не отвечали
Подсчёт сотрудников по отделам, включая пустые
Верните название каждого отдела и число его сотрудников — отделы без штата должны показать 0.
-- Departments(id, name)
-- Employee(id, name, salary, dept_id, manager_id)
-- напишите ваш запрос здесь
Напишите запрос.
Сделайте left join от отделов и посчитайте соединённый ключ: SELECT d.name, COUNT(e.id) FROM Departments d LEFT JOIN Employee e ON e.dept_id = d.id GROUP BY d.id, d.name. Используйте COUNT(e.id) (а не COUNT(*)), чтобы пустой отдел показал 0 — COUNT(*) посчитал бы одну строку с NULL как 1.
- ✗Использовать
COUNT(*)наLEFT JOIN, считая NULL-строку за 1 - ✗Делать inner join, который вовсе выбрасывает пустые отделы
- ✗Агрегировать только
Employee, из-за чего отделы без штата не появятся
- →Почему
COUNT(e.id)возвращает 0, аCOUNT(*)— 1 для пустого отдела? - →Что должно быть в
GROUP BY, когда вы выбираетеd.nameрядом со счётчиком?
Оглавление
Задача
Верните название каждого отдела из Departments и число его сотрудников, показывая 0 для пустых.
Решение
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;
Ключевые моменты
LEFT JOINотDepartmentsудерживает отделы без сотрудников (строка дополняется NULL).COUNT(e.id)игнорирует NULL, поэтому пустой отдел даёт0;COUNT(*)дал бы1.- В
GROUP BYвходят все неагрегированные столбцы выборки (d.id,d.name).
Оглавление