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

Ответ

Для агрегации данных, такой как вычисление средней зарплаты по отделам, используется оператор 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;

Ответ 18+ 🔞

А, ну это же классика, блядь! Все эти GROUP BY и AVG() — это как на заводе зарплату считать: всех по цехам раскидали и среднюю температуру по больнице вывели.

Смотри, представь таблицу employees — это типа список работяг. У каждого есть имя, отдел, где он пашет, и зарплата, которую он хавает.

И вот тебе надо узнать, в каком отделе начальство не жадное, а в каком народ за копейки впахивает. Берёшь и пишешь такой запрос, простой как три копейки:

SELECT
    department, -- Это отдел, понятное дело
    AVG(salary) AS average_salary -- А это мы считаем среднюю зп по палате
FROM employees
GROUP BY department; -- И вот этой магической фразой говорим: "Собери всех, кто в одном отделе, в кучку!"

Что происходит-то, ёпта? Компьютер берёт всю эту толпу сотрудников, смотрит на столбец department и начинает сортировать: ага, эти все из IT, эти из продаж, а эти из отдела кадров, где делать нихуя. Потом для каждой такой сформированной банды он берёт все их зарплаты, складывает и делит на количество рож — вот тебе и средняя арифметическая, как в школе.

На выходе получается табличка, от которой любой бухгалтер обосрётся: department average_salary
IT 85000.00 // Тут айтишники, они всегда с деньгами
Sales 62000.50 // Продажники, у них проценты
HR 55000.00 // Кадровики, ну вы поняли

Но это же некрасиво, когда цифры с кучей знаков после запятой! Нормальные люди округляют. Да и смотреть удобнее, когда отделы отсортированы по жирности зарплаты.

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

А теперь, внимание, самый частый косяк, который всех наебывает! Допустим, ты хочешь вывести только те отделы, где средняя зарплата зашкаливает за 70к. И тут новичок пишет WHERE AVG(salary) > 70000. И получает пиздюлину от базы данных!

Почему? Да потому что WHERE фильтрует строки ДО того, как они сгруппированы. А среднюю зарплату мы можем посчитать только ПОСЛЕ группировки. Для этого есть специальное словечко HAVING. Оно как WHERE, но для уже готовых, сгруппированных кучек.

SELECT department, AVG(salary) AS avg_sal
FROM employees
GROUP BY department
HAVING AVG(salary) > 70000; -- Вот так правильно, фильтруем уже сгруппированные результаты

Короче, запомни: GROUP BY — это разложить всех по коробочкам (отделам). AVG(), SUM(), COUNT() — это посчитать что-то внутри каждой коробочки. А HAVING — это выкинуть нахуй те коробочки, где результат подсчёта тебе не нравится. Всё просто, как дважды два, блядь.