Как на SQL найти отдел с самой высокой средней заработной платой?

«Как на SQL найти отдел с самой высокой средней заработной платой?» — вопрос из категории Базы данных, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Для решения этой задачи нужно:

  1. Сгруппировать записи по отделам.
  2. Для каждого отдела вычислить среднюю зарплату (AVG).
  3. Отсортировать результаты по средней зарплате в убывающем порядке и взять первую запись.

Предположим, таблица 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);

Этот запрос также корректно обработает случай нескольких отделов с одинаковой максимальной средней зарплатой.