Группировка по нескольким столбцам в SQL: GROUP BY x, y
Быстрый ответ
Агрегирование данных по нескольким измерениям выполняется с помощью оператора GROUP BY, включающего в себя несколько столбцов:
SELECT производитель, год, COUNT(*)
FROM продажи_авто
GROUP BY производитель, год;
В данном случае каждая уникальная комбинация значений производитель и год формирует отдельную группу, в которой функция COUNT(*) подсчитывает количество продаж. Не стоит ограничиваться только функцией подсчёта – вы можете использовать и другие агрегатные функции, такие как SUM(), AVG(), MIN(), MAX() и т.д.

Разбираемся с использованием GROUP BY
При использовании GROUP BY с несколькими столбцами мы можем проводить более детальный анализ данных. Группировка по таким полям, как производитель и год, позволяет увидеть временные тенденции различных брендов.
Группировка с применением нескольких столбцов
Чем больше столбцов вы включаете в GROUP BY, тем детальнее будут ваши группы. Однако важно уметь управлять детальностью запроса и не создавать слишком много мелких групп, избегая излишней сложности.
А где пропавшие группы?
Если ожидаемые вами группы отсутствуют в результатах запроса, то в данных нет записей для некоторых комбинаций столбцов. Это может служить хорошим методом обнаружения "пробелов" в данных.
Порядок в SQL-запросах
Хотите писать корректные SQL-запросы? Строго соблюдайте следующую последовательность: SELECT, FROM, WHERE, GROUP BY, HAVING, ORDER BY. Это предотвращает появление ошибок и получение некорректных результатов.
Визуализация
Продемонстрируем на примере корзины фруктов: Наши данные — это корзина с фруктами, а каждый вид фрукта и цвет — это столбец.
Корзина (🧺): [🍏, 🍎, 🍌, 🍌, 🍏, 🍎, 🥭, 🍎]
Допустим, мы проводим группировку по виду и цвету:
| Вид | Цвет | Количество |
| ----------| -----------| ---------- |
| Яблоко (🍎)| Красный | 📊🔴 |
| Яблоко (🍏)| Зелёный | 📊🟢 |
| Банан (🍌) | Жёлтый | 📊🟡 |
| Манго (🥭) | Оранжевый | 📊🟠 |
В SQL мы группируем данные и подсчитываем их количество, вот так визуализируя процесс.
Работаем с агрегированными результатами
HAVING vs WHERE
WHERE фильтрует данные до группировки, а HAVING применяется после группировки. Необходимо это учесть, чтобы корректно фильтровать данные.
Приводим в порядок с помощью ORDER BY
ORDER BY позволяет упорядочить результаты после группировки. Кроме того, этот оператор можно использовать в сочетании с агрегатными функциями, даже если они не указаны в SELECT.
Великий иллюзионист – подзапросы
Подзапросы позволяют добавить сложные вычисления и фильтрацию агрегатов в ваш SQL-запрос, увеличивая его точность и сложность.
Продвинутое использование GROUP BY
Загадка NULL-значений
Если вы наткнулись на NULL, воспринимайте его как джокера в вашем наборе данных. GROUP BY принимает NULL как отдельное значение. Примените COALESCE, чтобы заменить эти элементы на определённое значение в случае необходимости.
Размер означает многое
Ваши группы могут различаться по размеру, и наиболее мелкие из них иногда сложно заметить. Используйте COUNT(*), чтобы не пропустить их. Маленькие группы могут быть недостаточно информативными, поэтому всегда учитывайте плотность данных.
Выявление нарушений в данных
GROUP BY способен выявить аномалии в данных. Уникальное агрегатное значение может говорить о том, что требуется провести дополнительную проверку данных.
Полезные материалы
- SQL GROUP BY Statement — Гид по оператору
GROUP BYот W3Schools. - sql – Using group by on multiple columns — Дискуссия на Stack Overflow о многостолбцовом использовании
GROUP BY. - MySQL :: MySQL 8.0 Reference Manual :: 12.19.3 MySQL Handling of GROUP BY — Официальная документация MySQL, объясняющая принцип работы
GROUP BY. - SQL: GROUP BY Clause — Объяснение предложения
GROUP BYна TechOnTheNet. - SQL GROUP BY | Intermediate SQL – Mode — Руководство Mode Analytics с примерами использования
GROUP BY. - Data Types — Документация Oracle о типах данных, используемых в запросах с
GROUP BY.