12. Показать компании, отделы и количество сотрудников в каждом отделе
Условие задачи:
Даны три таблицы:
company— компании;department— отделы компаний;employee— сотрудники отделов.
Необходимо вывести:
название компании;
название отдела;
количество сотрудников в этом отделе.
Отделы без сотрудников также должны присутствовать в результате с количеством 0.
Код:
CREATE TABLE company (
id BIGINT PRIMARY KEY,
name_ VARCHAR NOT NULL
);
CREATE TABLE department (
id BIGINT PRIMARY KEY,
name_ VARCHAR NOT NULL,
company_id BIGINT NOT NULL,
FOREIGN KEY (company_id) REFERENCES company(id)
);
CREATE TABLE employee (
id BIGINT PRIMARY KEY,
name_ VARCHAR NOT NULL,
department_id BIGINT NOT NULL,
FOREIGN KEY (department_id) REFERENCES department(id)
);
INSERT INTO company (id, name_) VALUES
(1, 'Company 1'),
(2, 'Company 2'),
(3, 'Company 3');
INSERT INTO department (id, name_, company_id) VALUES
(1, 'Department 1', 1),
(2, 'Department 2', 1),
(3, 'Department 3', 2);
INSERT INTO employee (id, name_, department_id) VALUES
(1, 'Employee 1', 1),
(2, 'Employee 2', 2),
(3, 'Employee 3', 3);
Спойлеры к решению
Подсказки
💡 Соедини
💡 Для сотрудников используй
💡 Количество сотрудников можно посчитать через
💡 Сгруппируй результат по компании и отделу.
company и department по company.id = department.company_id.💡 Для сотрудников используй
LEFT JOIN, чтобы не потерять отделы без сотрудников.💡 Количество сотрудников можно посчитать через
COUNT(employee.id).💡 Сгруппируй результат по компании и отделу.
Решение
SELECT
c.name_ AS company_name,
d.name_ AS department_name,
COUNT(e.id) AS employee_count
FROM company c
JOIN department d
ON d.company_id = c.id
LEFT JOIN employee e
ON e.department_id = d.id
GROUP BY
c.id,
c.name_,
d.id,
d.name_
ORDER BY
c.name_,
d.name_;
JOIN связывает компании с их отделами.
Для сотрудников используется:
LEFT JOIN employee e
ON e.department_id = d.id
поэтому отдел без сотрудников не исчезнет из результата.
Важно считать именно:
COUNT(e.id)
а не COUNT(*): при отсутствии сотрудников COUNT(e.id) вернёт 0.
Для приведённых данных результат будет:
company_name | department_name | employee_count
-------------|-----------------|---------------
Company 1 | Department 1 | 1
Company 1 | Department 2 | 1
Company 2 | Department 3 | 1
Компания без отделов в такой результат не попадёт, поскольку вывод строится по отделам.