GROUP BY: как получить правильную сводку

Считать количество строк и количество покупателей — две разные задачи. SQL вернёт число в обоих случаях, но только одно будет отвечать на бизнес-вопрос.

SQL Studio / Разборы SQL / GROUP BY: как получить правильную сводку

Что происходит при группировке

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

SELECT status, COUNT(*) AS orders_n
FROM orders
GROUP BY status
ORDER BY orders_n DESC;
Результат на учебной базе
statusorders_n
delivered4
cancelled1
processing1

Это шесть заказов, не шесть покупателей: один клиент может сделать несколько заказов.

Строки, люди и пустые значения

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.

Разница между числом строк, заполненных значений и уникальных клиентов — в разборе COUNT DISTINCT.

Если после подсчёта появились лишние строки, разберите поиск дубликатов и размножение строк после JOIN.


Для последовательной практики на MySQL 8 — курс «SQL для аналитика» на Stepik с итоговой работой и возможностью получить сертификат.