Нужно получить по каждому менеджеру число выполненных и число отменённых заказов в одной строке результата. Какой подход позволяет это сделать?
AОтфильтровать строки по статусу через условие в
WHERE перед GROUP BY: одно из значений отбросится из выдачиBСоздать отдельный подзапрос для каждого значения статуса и соединить результаты через
JOIN по manager_idCИспользовать отдельный
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?Ещё вопросы по теме «Агрегация, GROUP BY и HAVING»
- Что делает оператор `DISTINCT` в `SELECT`-запросе?
- Что делает оператор `HAVING` в SQL-запросе с группировкой?
- Есть таблица `orders(user_id, amount)`. Какой запрос посчитает сумму всех заказов по каждому пользователю?
- Нужно посчитать сумму оплаченных заказов по каждому пользователю. В таблице `orders` есть поля `user_id`, `amount`, `status`. Какой запрос корректен и наиболее эффективен?
- В таблице пользователей есть колонка `middle_name`, в которой часто хранится `NULL`. Что вернёт выражение `COUNT(middle_name)`?
- Все вопросы по «Агрегация, GROUP BY и HAVING» →