Menu
Coddy logo textTech

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', хотя мы и не фильтровали весь запрос. Это хитрость, лежащая в основе каждого мультиметрического запроса для дашборда, который вы когда-либо напишете.

challenge icon

Задание

Легко

Доступные таблицы и столбцы:

  • <strong>orders</strong>: <strong>id</strong>, <strong>customer_id</strong>, <strong>status</strong>

Для каждого customer_id верните:

  • customer_id
  • total: общее количество заказов, сделанных этим клиентом
  • 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
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Продвинутый уровень