Выражения CASE и сводные запросы
Используйте CASE WHEN внутри агрегатных функций, чтобы преобразовывать длинные таблицы в широкие перекрёстные отчёты
«Выражения CASE и сводные запросы» — бесплатный урок SQL Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения SQL Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс SQL Academy содержит 4 уроков всего.
CASE: встроенное условие «если/иначе» для SQL
CASE — это тернарный оператор SQL. Есть две формы:
-- Searched CASE
CASE WHEN x > 0 THEN 'positive'
WHEN x < 0 THEN 'negative'
ELSE 'zero' END
-- Simple CASE
CASE status
WHEN 'A' THEN 'active'
WHEN 'P' THEN 'pending'
ELSE 'unknown'
ENDCASE в SELECT
Вычисление производного столбца:
SELECT id, total,
CASE
WHEN total >= 1000 THEN 'whale'
WHEN total >= 100 THEN 'regular'
ELSE 'small'
END AS bucket
FROM orders;CASE в WHERE и ORDER BY
Пользовательская фильтрация и сортировка:
-- Custom sort:
ORDER BY
CASE WHEN status = 'urgent' THEN 0 ELSE 1 END,
created_at DESC;
-- Conditional filter:
WHERE CASE WHEN $1 = 'paid' THEN status = 'paid'
ELSE status IN ('pending','paid')
END;CASE внутри агрегатных функций: условный подсчёт
Классический приём для построения сводной таблицы:
SELECT user_id,
COUNT(*) AS total,
SUM(CASE WHEN status = 'paid' THEN 1 ELSE 0 END) AS paid,
SUM(CASE WHEN status = 'pending' THEN 1 ELSE 0 END) AS pending,
SUM(CASE WHEN status = 'cancelled' THEN 1 ELSE 0 END) AS cancelled
FROM orders
GROUP BY user_id;FILTER: более понятная альтернатива
Предложение FILTER в PostgreSQL читается понятнее:
SELECT user_id,
COUNT(*) AS total,
COUNT(*) FILTER (WHERE status = 'paid') AS paid,
COUNT(*) FILTER (WHERE status = 'pending') AS pending,
COUNT(*) FILTER (WHERE status = 'cancelled') AS cancelled
FROM orders
GROUP BY user_id;Сведение месяцев в столбцы
Преобразуйте данные из длинного формата в широкий с помощью CASE и агрегатной функции:
SELECT year,
SUM(CASE WHEN month = 1 THEN revenue END) AS jan,
SUM(CASE WHEN month = 2 THEN revenue END) AS feb,
-- ...
SUM(CASE WHEN month = 12 THEN revenue END) AS dec
FROM monthly_revenue
GROUP BY year
ORDER BY year;Сведение категорий
Одна строка на пользователя, один столбец на статус:
SELECT user_id,
SUM(total) FILTER (WHERE status = 'paid') AS paid_total,
SUM(total) FILTER (WHERE status = 'pending') AS pending_total
FROM orders GROUP BY user_id;Ограничения сводных таблиц на основе CASE
Во время написания запроса необходимо знать целевые столбцы. Для динамических сводных таблиц сформируйте SQL в приложении или используйте процедурный PL/pgSQL.
CASE и COALESCE / NULLIF
COALESCE = «первое значение, отличное от NULL». NULLIF = «NULL, если значения равны». CASE универсальнее — используйте его, когда COALESCE и NULLIF не подходят.
Совместимость типов
Все ветви CASE должны возвращать совместимые типы. При смешивании типов явно приведите их:
SELECT CASE WHEN x THEN 1::TEXT ELSE 'no' END;Вложенный CASE
Многоуровневое ветвление:
SELECT CASE
WHEN amount IS NULL THEN 'no payment'
WHEN amount = 0 THEN 'free'
WHEN amount < 10 THEN 'cheap'
ELSE
CASE WHEN paid_at IS NULL THEN 'overdue' ELSE 'paid' END
END AS status FROM invoices;Итоги
CASE — универсальная конструкция «если/иначе» в SQL.
- Вычисляемые столбцы в SELECT
- Сводные таблицы через CASE внутри агрегатной функции или FILTER
- Пользовательская логика в WHERE и ORDER BY
Быстрая проверка
Какое предложение лучше всего читается для условной агрегации в PostgreSQL?
Часто задаваемые вопросы
Урок «Выражения CASE и сводные запросы» бесплатный?
Да — полный текст урока «Выражения CASE и сводные запросы» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс SQL Academy, подпишись на CoddyKit PRO. Курс SQL Academy содержит 4 уроков всего.
Чему я научусь в уроке «Выражения CASE и сводные запросы»?
Используйте CASE WHEN внутри агрегатных функций, чтобы преобразовывать длинные таблицы в широкие перекрёстные отчёты Ты практикуешь SQL Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать SQL Academy?
Предыдущий опыт не требуется. SQL Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Выражения CASE и сводные запросы»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке SQL Academy?
Да. Каждый урок SQL Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- UNION, INTERSECT, EXCEPT
- UNION ALL и UNION (стоимость удаления дубликатов)
- Выражения CASE и сводные запросы
- Шаблоны перекрёстных таблиц (PostgreSQL crosstab())