Статистика по отделам

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, чтобы отделы с одинаковыми названиями не объединились в одну группу.