Короткий ответ
Нужно сгруппировать таблицу заказов по статусу и в одном SELECT перечислить сразу несколько агрегатных функций — COUNT(*) и SUM(amount) — они вычисляются параллельно для каждой группы.
Как это работает подробнее
при наличии GROUP BY status СУБД формирует группы строк с одинаковым статусом, а затем для каждой группы независимо вычисляет все агрегатные функции, указанные в SELECT; это не требует отдельных проходов по данным для каждой метрики.
Пример кода
Запрос SQL
SELECT status, COUNT(*) AS orders_cnt, SUM(amount) AS total_amount
FROM orders
GROUP BY status
ORDER BY orders_cnt DESC;Что использовать на практике
- На практике: такой подход эффективнее, чем писать два отдельных запроса и затем вручную сопоставлять результаты — СУБД читает таблицу один раз и сразу считает всё необходимое. Это базовый паттерн для большинства сводных отчётов.
- Результат: Результат — по одной строке на каждый статус с двумя метриками.
- Проверка: сумма
orders_cntпо всем строкам должна равнятьсяSELECT COUNT(*) FROM orders.
Подводные камни
- Частая ошибка: пытаются добавить третью метрику с другой логикой фильтрации (например, «выручка только по заказам старше недели») в тот же
GROUP BY statusбез условной агрегации (CASE WHEN/FILTER), что требует либо дополнительного столбца в условии, либо отдельного запроса.