LEFT JOIN сохранит все подразделения, включая пустые, а COUNT(e.id) посчитает только реальных сотрудников. Группировать нужно по ID и названию отдела.
Запрос SQL для подсчёта числа сотрудников в каждом подразделении
LEFT JOIN сохранит все подразделения, включая пустые, а COUNT(e.id) посчитает только реальных сотрудников. Группировать нужно по ID и названию отдела.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Имеются две таблицы: divisions (список подразделений) и employees (список сотрудников). Требуется написать SQL‑запрос, который выведет название каждого подразделения и количество работников, относящихся к нему. Ожидаемый результат: | division_name | employees_count | | Отдел ИТ | 28 |
CREATE TABLE divisions (id PRIMARY KEY, name);
INSERT INTO divisions (id, name)
VALUES
(1, 'Отдел ИТ'),
(2, 'Отдел ИБ'),
(3, 'Отдел кадров');
CREATE TABLE employees (
id PRIMARY KEY,
division_id,
name,
surname,
mail,
CONSTRAINT division_fk
FOREIGN KEY (division_id)
REFERENCES divisions(id)
);
INSERT INTO employees (id, division_id, name, surname, mail)
VALUES
(1, 1, 'Имя', 'Фамилия', 'e-mail@yandex.ru'),
(2, 1, 'Имя1', 'Фамилия1', 'e-mail1@yandex.ru'),
(3, 1, 'Имя2', 'Фамилия2', 'e-mail2@yandex.ru'),
(4, 1, 'Имя3', 'Фамилия3', 'e-mail3@yandex.ru'),
(5, 1, 'Имя4', 'Фамилия4', 'e-mail4@yandex.ru'),
(6, 1, 'Имя5', 'Фамилия5', 'e-mail5@yandex.ru'),
(7, 1, 'Имя6', 'Фамилия6', 'e-mail6@yandex.ru'),
(8, 1, 'Имя7', 'Фамилия7', 'e-mail7@yandex.ru'),
(9, 3, 'Имя8', 'Фамилия8', 'e-mail8@yandex.ru');
Ответ
LEFT JOIN сохранит все подразделения, включая пустые, а COUNT(e.id) посчитает только реальных сотрудников. Группировать нужно по ID и названию отдела.
SELECT d.name AS division_name, COUNT(e.id) AS employees_count
FROM divisions d
LEFT JOIN employees e ON e.division_id = d.id
GROUP BY d.id, d.name
ORDER BY d.id;
Для приведённых INSERT результат: Отдел ИТ — 8, Отдел ИБ — 0, Отдел кадров — 1. Число 28 в описании — лишь пример формата, оно не следует из этих данных. В DDL также необходимо задать реальные типы колонок для выбранной СУБД; показанный вариант является сокращённой схемой.