Нужно получить по каждому менеджеру число выполненных и число отменённых заказов в одной строке результата. Какой подход позволяет это сделать?

AОтфильтровать строки по статусу через условие в WHERE перед GROUP BY: одно из значений отбросится из выдачи
BСоздать отдельный подзапрос для каждого значения статуса и соединить результаты через JOIN по manager_id
CИспользовать отдельный GROUP BY-запрос для каждого значения статуса: получится две таблицы вместо одной строки
DУсловная агрегация: SUM(CASE WHEN status='done' THEN 1 END) и аналогичный аналог для отменённых внутри GROUP BY
Правильный ответ. Условная агрегация через SUM(CASE WHEN ... THEN 1 END) внутри GROUP BY даёт две колонки в одной строке.

Разбор

Условная агрегация через SUM(CASE WHEN ... THEN 1 ELSE 0 END) или COUNT(CASE WHEN ... THEN 1 END) позволяет считать строки по нескольким условиям одновременно внутри одного GROUP BY-запроса. Это избавляет от необходимости писать несколько отдельных подзапросов или JOIN-ов к одной таблице. В PostgreSQL аналогичный результат даёт синтаксис FILTER (WHERE ...).

Проверь себя · 1/3разбор после ответа
Есть таблица payments(amount), в части строк amount равно NULL. Какой запрос посчитает количество всех строк в таблице, включая строки с NULL в столбце amount?
Тренировать SQL в Telegram

Ещё вопросы по теме «Агрегация, GROUP BY и HAVING»