← Назад к вопросам
Как получить отделы и среднюю заработную плату из таблицы с полями имя, отдел и заработная плата?
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 |
Важные замечания:
-
Обработка NULL значений: Функция
AVG()автоматически игнорирует NULL значения. Если все значения в группе NULL, результатом будет NULL. -
Производительность: При работе с большими таблицами рекомендуется:
- Добавить индексы на столбец
department - Рассмотреть использование материализованных представлений для часто запрашиваемой статистики
- Добавить индексы на столбец
-
Расширенные сценарии:
-- С фильтрацией по дате (если есть поле 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
- HAVING vs WHERE: Важно различать:
WHEREфильтрует строки до группировкиHAVINGфильтрует группы после агрегации
Такой подход обеспечивает точное и эффективное вычисление средней заработной платы по отделам с возможностью дополнительной фильтрации и сортировки результатов.