GROUP BY и агрегаты: считаем данные правильно
Учимся получать количество, сумму, среднее и максимум по группам — и не путать WHERE с HAVING.
Опубликовано 11 августа 2026
Что делает группировка
GROUP BY объединяет строки с одинаковым значением и позволяет посчитать показатель для каждой группы.
SELECT department, COUNT(*) AS crew_count
FROM crew_members
GROUP BY department
ORDER BY crew_count DESC;В результате каждая строка описывает уже не одного сотрудника, а целый отдел.
Основные агрегатные функции
COUNT(*)считает строки.SUM(column)находит сумму.AVG(column)вычисляет среднее значение.MIN(column)иMAX(column)находят границы.
Большинство функций не учитывает NULL, но COUNT(*) считает строку независимо от заполненности её столбцов.
WHERE или HAVING
WHERE фильтрует исходные строки до группировки. HAVING проверяет уже готовые группы.
SELECT department, COUNT(*) AS missing_count
FROM crew_members
WHERE official_status = 'missing'
GROUP BY department
HAVING COUNT(*) >= 2;Здесь сначала остаются пропавшие сотрудники, затем отделы группируются, и только после этого исключаются группы меньше двух человек.
Правило для SELECT
Если запрос содержит GROUP BY, каждый выбранный столбец должен либо входить в группировку, либо находиться внутри агрегатной функции. Иначе база не понимает, какое из нескольких значений нужно показать.