Добрый день. Есть задача, реализовать хранение структуры компании в БД. СУБД MySql 8.0.33
Структура
- Отдел по обслуживанию клиентов (11 сотрудников)
- Отдел продаж (4 сотрудника)
- Отдел оптовых продаж (2 сотрудника)
- Отдел розничных продаж (2 сотрудника)
- Отдел логистики (7 сотрудников)
- Склад (2 сотрудника)
- Отдел доставки (5 сотрудников)
- Производственный отдел (7 сотрудников)
- Инженерный отдел (4 сотрудника)
- Отдел проверки качества (2 сотрудник)
- Отдел закупок (1 сотрудник)
- Бухгалтерия (2 сотрудника)
Для этого реализовал 2 таблицы:
1) Departments хранит отделы и ИД родительского отдела
Таблица DepartmentsХ
CREATE TABLE `departments` (
`ID` int NOT NULL AUTO_INCREMENT,
`NameDepartment` longtext,
`ParentDepartmentID` int DEFAULT NULL,
PRIMARY KEY (`ID`)
)
2) Сотрудники отделов
Таблица EmployeeCREATE TABLE `employees` (
`ID` int NOT NULL AUTO_INCREMENT,
`DepartmentID` int DEFAULT NULL,
PRIMARY KEY (`ID`)
)
Для того, чтобы вывести инфу об отделах использовал рекурсивные запросы. Но у меня не получается подсчитать сотрудников для каждого уровня. Получалось только самого нижнего уровня, данные которые вносятся вручную, либо на самых верхних уровнях общее количество подсчитать.
Использовать агрегатные функции внутри рекурсивного запроса нельзя, а как подсчитать для каждого уровня количество сотрудников - не понимаю.
Что у меня получилось:
1) Вывести количество сотрудников на нижних уровнях иерархии
Запрос 1WITH RECURSIVE cte AS(
SELECT d.ID, d.NameDepartment, d.ParentDepartmentID, e.ID AS Emp_ID
FROM departments d
INNER JOIN employees e ON e.DepartmentID = d.ID
UNION ALL
SELECT d.ID, d.NameDepartment, d.ParentDepartmentID, cte.Emp_ID
FROM cte
INNER JOIN departments d ON cte.ID = d.ParentDepartmentID
)
SELECT cte.ID, cte.NameDepartment, COUNT(cte.Emp_ID) AS Emp_Count
FROM cte
GROUP BY cte.ID, cte.NameDepartment;
2) Вывести количество отделов на каждом уровне включая самые верхние. Например,
"Отдел по обслуживанию клиентов состоит из 7 отделов включая себя".
Запрос 2WITH RECURSIVE cte
AS(
SELECT d.ID, d.NameDepartment, d.ParentDepartmentID, e.ID AS Emp_ID
FROM departments d
INNER JOIN employees e ON e.ID = d.ID
UNION ALL
SELECT d.ID, d.NameDepartment, d.ParentDepartmentID, cte.Emp_ID
FROM cte
INNER JOIN departments d ON cte.ParentDepartmentID = d.ID
)
SELECT NameDepartment, COUNT(*) AS COUNT FROM cte
group by NameDepartment