SQL Studio / Разборы SQL / GROUP BY: как получить правильную сводку
Что происходит при группировке
GROUP BY собирает строки с одинаковыми значениями ключа в группы. Агрегатные функции вычисляют результат отдельно для каждой группы.
SELECT status, COUNT(*) AS orders_n
FROM orders
GROUP BY status
ORDER BY orders_n DESC;
| status | orders_n |
|---|---|
| delivered | 4 |
| cancelled | 1 |
| processing | 1 |
Это шесть заказов, не шесть покупателей: один клиент может сделать несколько заказов.
Строки, люди и пустые значения
SELECT
status,
COUNT(*) AS orders_n,
COUNT(DISTINCT customer_id) AS customers_n
FROM orders
GROUP BY status;
COUNT(*) учитывает все строки группы. COUNT(customer_id) пропускает NULL. COUNT(DISTINCT customer_id) считает уникальные ненулевые идентификаторы. Выбор зависит от единицы измерения — заказов, людей или событий.
WHERE или HAVING?
SELECT customer_id, COUNT(*) AS orders_n
FROM orders
WHERE status = 'delivered'
GROUP BY customer_id
HAVING COUNT(*) >= 2;
WHERE сначала оставляет доставки; GROUP BY считает их по клиентам; HAVING оставляет группы с двумя и более доставками. На этих данных результат — customer_id = 1, orders_n = 2.
Попрактикуйтесь
Сначала посчитайте уникальные города, затем перейдите к подсчёту заказов по городам через JOIN и GROUP BY.
Для последовательной практики на MySQL 8 — курс «SQL для аналитика» на Stepik с итоговой работой и возможностью получить сертификат.