← Назад к вопросам

Как получить отделы и среднюю заработную плату из таблицы с полями имя, отдел и заработная плата?

2.3 Middle🔥 182 комментариев
#Базы данных и SQL

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

SQL Запрос для получения отделов и средней зарплаты

Для решения этой задачи нам потребуется использовать агрегирующую функцию AVG() и оператор GROUP BY. Вот базовый SQL-запрос:

SELECT 
    department AS Отдел,
    AVG(salary) AS Средняя_Зарплата
FROM employees
GROUP BY department;

Ключевые аспекты решения:

1. Агрегация данных:

  • Функция AVG() вычисляет среднее арифметическое значений зарплаты
  • При использовании агрегатных функций необходимо группировать данные по неагрегированным столбцам

2. Группировка:

  • GROUP BY department группирует записи по отделам
  • Все строки с одинаковым значением отдела будут обработаны как одна группа
  • Для каждой группы рассчитывается своя средняя зарплата

3. Дополнительные улучшения запроса:

SELECT 
    department AS Отдел,
    ROUND(AVG(salary), 2) AS Средняя_Зарплата,
    COUNT(*) AS Количество_Сотрудников
FROM employees
WHERE salary IS NOT NULL
GROUP BY department
ORDER BY Средняя_Зарплата DESC;

Пояснение улучшений:

  • ROUND() - округляет среднюю зарплату до 2 десятичных знаков
  • COUNT(*) - показывает количество сотрудников в каждом отделе
  • WHERE salary IS NOT NULL - исключает записи с пустыми зарплатами
  • ORDER BY - сортирует результаты по убыванию средней зарплаты

Пример данных и результата:

Исходная таблица employees:

| name     | department  | salary |
|----------|-------------|--------|
| Иван     | IT          | 100000 |
| Мария    | IT          | 120000 |
| Алексей  | Бухгалтерия | 80000  |
| Ольга    | Бухгалтерия | 85000  |
| Петр     | IT          | 110000 |

Результат выполнения запроса:

| Отдел        | Средняя_Зарплата | Количество_Сотрудников |
|--------------|------------------|------------------------|
| IT           | 110000.00        | 3                      |
| Бухгалтерия  | 82500.00         | 2                      |

Важные замечания:

  1. Обработка NULL значений: Функция AVG() автоматически игнорирует NULL значения. Если все значения в группе NULL, результатом будет NULL.

  2. Производительность: При работе с большими таблицами рекомендуется:

    • Добавить индексы на столбец department
    • Рассмотреть использование материализованных представлений для часто запрашиваемой статистики
  3. Расширенные сценарии:

-- С фильтрацией по дате (если есть поле hire_date)
SELECT 
    department,
    AVG(salary) AS avg_salary
FROM employees
WHERE hire_date >= '2023-01-01'
GROUP BY department
HAVING AVG(salary) > 50000; -- только отделы со средней зарплатой выше 50000
  1. HAVING vs WHERE: Важно различать:
    • WHERE фильтрует строки до группировки
    • HAVING фильтрует группы после агрегации

Такой подход обеспечивает точное и эффективное вычисление средней заработной платы по отделам с возможностью дополнительной фильтрации и сортировки результатов.