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

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

Ответ

Для агрегации данных, такой как вычисление средней зарплаты по отделам, используется оператор GROUP BY в сочетании с агрегатной функцией AVG().

Допустим, таблица называется employees и содержит поля:

  • name (имя сотрудника, VARCHAR)
  • department (отдел, VARCHAR)
  • salary (зарплата, DECIMAL или INT)

Базовый SQL-запрос:

SELECT 
    department,
    AVG(salary) AS average_salary
FROM employees
GROUP BY department;

Что делает этот запрос:

  1. FROM employees — выбирает данные из таблицы сотрудников.
  2. GROUP BY department — группирует все строки таблицы по уникальным значениям в столбце department. Все сотрудники одного отдела попадают в одну группу.
  3. AVG(salary) — для каждой сформированной группы (отдела) вычисляет среднее арифметическое значение зарплаты.
  4. AS average_salary — даёт псевдоним столбцу с результатом вычисления для удобства чтения.
Пример результата: department average_salary
IT 85000.00
Sales 62000.50
HR 55000.00

Улучшенный запрос с округлением и сортировкой: Часто среднюю зарплату удобно представлять в округлённом виде и отсортировать для наглядности.

SELECT 
    department,
    ROUND(AVG(salary), 2) AS average_salary -- Округляем до 2 знаков после запятой
FROM employees
GROUP BY department
ORDER BY average_salary DESC; -- Сортировка от самой высокой к самой низкой

Важные нюансы:

  • В SELECT с GROUP BY можно включать только столбцы, по которым идёт группировка (department), и результаты агрегатных функций (AVG(salary), COUNT(*) и т.д.).
  • Функция AVG() игнорирует значения NULL в столбце salary. Если все значения в группе NULL, результат будет NULL.
  • Для фильтрации групп (например, вывести только отделы со средней зарплатой > 70000) используйте HAVING, а не WHERE.
    SELECT department, AVG(salary) AS avg_sal
    FROM employees
    GROUP BY department
    HAVING AVG(salary) > 70000;