43. Получить статистику по каждому отделу
Условие задачи:
Даны таблицы:
Employees(EmployeeID, Name, DepartmentID, Salary);Departments(DepartmentID, DepartmentName).
Необходимо для каждого отдела вывести:
название отдела;
количество сотрудников;
среднюю зарплату, округлённую до двух знаков;
максимальную зарплату;
минимальную зарплату.
Результат нужно отсортировать по количеству сотрудников по убыванию.
Спойлеры к решению
Подсказки
💡 Используй
💡 Для подсчёта сотрудников используй
💡 Среднюю, максимальную и минимальную зарплату можно получить через
💡 Среднюю зарплату округли через
💡 Группируй по идентификатору и названию отдела.
LEFT JOIN, чтобы сохранить отделы без сотрудников.💡 Для подсчёта сотрудников используй
COUNT(EmployeeID), а не COUNT(*).💡 Среднюю, максимальную и минимальную зарплату можно получить через
AVG(), MAX() и MIN().💡 Среднюю зарплату округли через
ROUND(..., 2).💡 Группируй по идентификатору и названию отдела.
Решение
SELECT
d.DepartmentName AS department_name,
COUNT(e.EmployeeID) AS employee_count,
ROUND(AVG(e.Salary), 2) AS average_salary,
MAX(e.Salary) AS max_salary,
MIN(e.Salary) AS min_salary
FROM Departments d
LEFT JOIN Employees e
ON e.DepartmentID = d.DepartmentID
GROUP BY
d.DepartmentID,
d.DepartmentName
ORDER BY
employee_count DESC;
LEFT JOIN позволяет включить в результат отделы, в которых нет сотрудников.
Для таких отделов:
employee_count = 0
average_salary = NULL
max_salary = NULL
min_salary = NULL
Используется:
COUNT(e.EmployeeID)
а не COUNT(*), потому что при LEFT JOIN для пустого отдела всё равно будет сформирована строка, но поля сотрудника будут равны NULL.
Группировка выполняется также по DepartmentID, чтобы отделы с одинаковыми названиями не объединились в одну группу.