COUNT с CASE
Часть раздела Продвинутый уровень путешествия по SQL на Coddy. Урок 12 из 27.
Вы можете поместить выражение CASE внутрь агрегатной функции. Секрет в том, что COUNT игнорирует NULL, поэтому CASE без ELSE подсчитывает только строки, соответствующие условию.
SELECT
COUNT(*) AS total,
COUNT(CASE WHEN status = 'active' THEN 1 END) AS active_count
FROM usersТеперь active_count — это количество строк 'active', хотя мы не фильтровали весь запрос. В этом заключается хитрость каждого запроса для дашборда с несколькими метриками, который вам когда-либо придётся написать.
Задание
ЛегкоДоступные таблицы и столбцы:
orders:id,customer_id,status
Для каждого customer_id верните:
customer_idtotal: общее количество заказов, размещённых этим клиентомshipped: количество записей, гдеstatus = 'shipped'cancelled: количество записей, гдеstatus = 'cancelled'
Верните только тех клиентов, у которых есть как минимум один отменённый заказ. Отсортируйте по customer_id.
Попробуйте сами
SELECT customer_id,
COUNT(*) AS total,
-- отправленные, отменённые с помощью COUNT(CASE ...)
FROM orders
GROUP BY customer_id
-- фильтр клиентов с хотя бы одной отменой
ORDER BY customer_id
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Продвинутый уровень
Потренируйтесь самостоятельно: Песочница SQL