Как посчитать сумму по каждой группе в SQL (SUM и GROUP BY)?
В таблице продаж каждая строка — это товар, его категория и сумма. Хочу узнать общую выручку по каждой категории. Как посчитать сумму с разбивкой по группам в SQL?
2 ответа
Сумма по группам — это связка агрегата SUM с GROUP BY:
SELECT category, SUM(amount) AS total_revenue
FROM sales
GROUP BY category;
GROUP BY разбивает строки на группы по категории, а SUM(amount) складывает суммы внутри каждой группы. Результат — по строке на категорию с её общей выручкой.
Можно считать сразу несколько показателей:
SELECT
category,
SUM(amount) AS revenue,
COUNT(*) AS sales_count,
AVG(amount) AS avg_check
FROM sales
GROUP BY category;
Чтобы отсортировать категории по убыванию выручки (самые прибыльные сверху):
SELECT category, SUM(amount) AS revenue
FROM sales
GROUP BY category
ORDER BY revenue DESC;
Заметьте — в ORDER BY можно использовать алиас revenue.
Если нужно оставить только категории с выручкой выше порога — это фильтр по агрегату, значит HAVING (не WHERE):
GROUP BY category
HAVING SUM(amount) > 100000
Частая ошибка: положить в SELECT столбец, которого нет в GROUP BY и который не обёрнут в агрегат (например, product_name). Группа объединяет много товаров — СУБД не знает, какое имя показать, и выдаст ошибку.
Помните про NULL: SUM пропускает NULL-значения, а не считает их за ноль. Обычно это то, что нужно. Но если в группе вообще все значения NULL, SUM вернёт NULL, а не 0 — и в отчёте появится пустая ячейка. Если хотите видеть 0, заверните в COALESCE: COALESCE(SUM(amount), 0).