Запрос SQL для подсчёта числа сотрудников в каждом подразделении

LEFT JOIN сохранит все подразделения, включая пустые, а COUNT(e.id) посчитает только реальных сотрудников. Группировать нужно по ID и названию отдела.

Короткий ответ

Что ответить на собеседовании

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 также необходимо задать реальные типы колонок для выбранной СУБД; показанный вариант является сокращённой схемой.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее