Ответ
Для решения этой задачи нужно:
- Сгруппировать записи по отделам.
- Для каждого отдела вычислить среднюю зарплату (
AVG). - Отсортировать результаты по средней зарплате в убывающем порядке и взять первую запись.
Предположим, таблица employees имеет поля:
name(имя сотрудника)department(отдел)salary(зарплата)
SQL-запрос (общий синтаксис):
SELECT
department,
AVG(salary) AS average_salary
FROM employees
GROUP BY department
ORDER BY average_salary DESC
LIMIT 1;
Пояснение:
GROUP BY department— группирует всех сотрудников по отделам.AVG(salary)— вычисляет среднее арифметическое значенийsalaryв каждой группе.ORDER BY average_salary DESC— сортирует отделы по вычисленной средней зарплате от наибольшей к наименьшей.LIMIT 1(в MySQL, PostgreSQL, SQLite) /FETCH FIRST 1 ROW ONLY(в стандарте SQL) /TOP 1(в SQL Server) — ограничивает результат одной строкой, возвращая отдел-лидер.
Вариант для SQL Server (используя TOP и WITH TIES):
SELECT TOP 1 WITH TIES
department,
AVG(salary) AS average_salary
FROM employees
GROUP BY department
ORDER BY average_salary DESC;
Ключевое слово WITH TIES полезно, если несколько отделов имеют одинаковую, максимальную среднюю зарплату — в этом случае будут возвращены все такие отделы.
Вариант с использованием подзапроса или CTE (если нужны все данные отдела):
WITH DepartmentAverages AS (
SELECT
department,
AVG(salary) AS avg_sal
FROM employees
GROUP BY department
)
SELECT *
FROM DepartmentAverages
WHERE avg_sal = (SELECT MAX(avg_sal) FROM DepartmentAverages);
Этот запрос также корректно обработает случай нескольких отделов с одинаковой максимальной средней зарплатой.