Используйте LEFT JOIN от departments к employees и считайте e.id, а не COUNT(*). Тогда отдел без сотрудников останется в выдаче с количеством 0.
Численность персонала по каждому отделу
Используйте LEFT JOIN от departments к employees и считайте e.id, а не COUNT(*). Тогда отдел без сотрудников останется в выдаче с количеством 0.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Сформировать перечень всех подразделений, указав количество их работников. В итоговый набор следует включать лишь те отделы, у которых присутствует название.
CREATE TABLE departments (
id INT PRIMARY KEY,
name VARCHAR(100) NOT NULL
);
CREATE TABLE employees (
id INT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
department_id INT,
FOREIGN KEY (department_id) REFERENCES departments(id)
);
Ответ
Используйте LEFT JOIN от departments к employees и считайте e.id, а не COUNT(*). Тогда отдел без сотрудников останется в выдаче с количеством 0.
SELECT d.id, d.name, COUNT(e.id) AS employee_count
FROM departments d
LEFT JOIN employees e ON e.department_id = d.id
WHERE d.name IS NOT NULL AND TRIM(d.name) <> ''
GROUP BY d.id, d.name;
NOT NULL уже задан в DDL, но не запрещает пустые или пробельные названия — поэтому добавлен TRIM. Группировка по ID сохраняет отдельные отделы с одинаковыми названиями. COUNT(*) дал бы 1 для пустого отдела из-за строки, сохранённой внешним соединением.