SUM с CASE
Часть раздела Продвинутый уровень путешествия по SQL на Coddy — урок 13 из 27.
Та же идея работает с SUM: и это даже более гибко. CASE может возвращать 1 для соответствующих строк и 0 для всех остальных, или он может возвращать любое числовое значение, чтобы по-разному взвешивать строки.
SELECT
SUM(CASE WHEN status = 'active' THEN 1 ELSE 0 END) AS active_count,
SUM(CASE WHEN plan = 'pro' THEN amount ELSE 0 END) AS pro_revenue
FROM usersSUM(CASE … THEN 1 ELSE 0 END) и COUNT(CASE … THEN 1 END) дают одинаковый результат при подсчете; выбирайте тот стиль, который предпочитает ваша команда.
Задание
ЛегкоДоступные таблицы и столбцы:
<strong>transactions</strong>:<strong>id</strong>,<strong>category</strong>,<strong>type</strong>,<strong>amount</strong>
type принимает значения 'sale' или 'refund'. Для каждой category верните:
categorynet_revenue: сумма сумм продаж минус сумма сумм возвратов
Вычислите net_revenue в одном выражении SUM(CASE …), где возвраты учитываются как отрицательные числа. Отсортируйте по net_revenue в порядке убывания.
Шпаргалка
Используйте SUM с CASE для условной агрегации значений — возвращайте 1/0 для подсчета или фактические значения для взвешенных сумм:
SELECT
SUM(CASE WHEN status = 'active' THEN 1 ELSE 0 END) AS active_count,
SUM(CASE WHEN plan = 'pro' THEN amount ELSE 0 END) AS pro_revenue
FROM usersSUM(CASE … THEN 1 ELSE 0 END) и COUNT(CASE … THEN 1 END) дают одинаковый результат подсчета.
Попробуйте сами
SELECT category,
-- один SUM(CASE ...), где возвраты учитываются как отрицательные
FROM transactions
GROUP BY category
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.