← Все вопросы

Как посчитать сумму по каждой группе в SQL (SUM и GROUP BY)?

Задан 5 месяцев назад1.3к просмотров2 ответа
9

В таблице продаж каждая строка — это товар, его категория и сумма. Хочу узнать общую выручку по каждой категории. Как посчитать сумму с разбивкой по группам в SQL?

2 ответа

13
✓ Принятый ответ — помог автору

Сумма по группам — это связка агрегата 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). Группа объединяет много товаров — СУБД не знает, какое имя показать, и выдаст ошибку.

4

Помните про NULL: SUM пропускает NULL-значения, а не считает их за ноль. Обычно это то, что нужно. Но если в группе вообще все значения NULL, SUM вернёт NULL, а не 0 — и в отчёте появится пустая ячейка. Если хотите видеть 0, заверните в COALESCE: COALESCE(SUM(amount), 0).

Ваш ответ

Войдите, чтобы ответить на вопрос.