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', хотя мы и не фильтровали весь запрос. Это хитрость, лежащая в основе каждого мультиметрического запроса для дашборда, который вы когда-либо напишете.
Задание
ЛегкоДоступные таблицы и столбцы:
<strong>orders</strong>:<strong>id</strong>,<strong>customer_id</strong>,<strong>status</strong>
Для каждого customer_id верните:
customer_idtotal: общее количество заказов, сделанных этим клиентомshipped: количество, гдеstatus = 'shipped'cancelled: количество, гдеstatus = 'cancelled'
Верните только тех клиентов, у которых есть хотя бы один отмененный заказ. Отсортируйте по customer_id.
Шпаргалка
Используйте CASE внутри COUNT для подсчета строк, соответствующих условию, без фильтрации всего запроса (COUNT игнорирует NULL, поэтому опустите предложение ELSE):
SELECT
COUNT(*) AS total,
COUNT(CASE WHEN status = 'active' THEN 1 END) AS active_count
FROM usersПопробуйте сами
SELECT customer_id,
COUNT(*) AS total,
-- shipped, cancelled с использованием COUNT(CASE ...)
FROM orders
GROUP BY customer_id
-- фильтрация по клиентам с хотя бы одной отменой
ORDER BY customer_id
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.