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

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 ...).

Можно заниматься бесплатно

Готовим вопросы…

Три вопроса по теме этой страницы, с объяснениями.

Продолжить в браузере

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