← Все статьи
АналитикаСредний7 минут чтения

GROUP BY и агрегаты: считаем данные правильно

Учимся получать количество, сумму, среднее и максимум по группам — и не путать WHERE с HAVING.

Опубликовано 11 августа 2026

01

Что делает группировка

GROUP BY объединяет строки с одинаковым значением и позволяет посчитать показатель для каждой группы.

SELECT department, COUNT(*) AS crew_count
FROM crew_members
GROUP BY department
ORDER BY crew_count DESC;

В результате каждая строка описывает уже не одного сотрудника, а целый отдел.

02

Основные агрегатные функции

  • COUNT(*) считает строки.
  • SUM(column) находит сумму.
  • AVG(column) вычисляет среднее значение.
  • MIN(column) и MAX(column) находят границы.

Большинство функций не учитывает NULL, но COUNT(*) считает строку независимо от заполненности её столбцов.

03

WHERE или HAVING

WHERE фильтрует исходные строки до группировки. HAVING проверяет уже готовые группы.

SELECT department, COUNT(*) AS missing_count
FROM crew_members
WHERE official_status = 'missing'
GROUP BY department
HAVING COUNT(*) >= 2;

Здесь сначала остаются пропавшие сотрудники, затем отделы группируются, и только после этого исключаются группы меньше двух человек.

04

Правило для SELECT

Если запрос содержит GROUP BY, каждый выбранный столбец должен либо входить в группировку, либо находиться внутри агрегатной функции. Иначе база не понимает, какое из нескольких значений нужно показать.