0Pricing
SQL Academy · Урок

Выражения 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'
END

CASE в 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 — локальная установка не требуется.

Все уроки этого курса

  1. UNION, INTERSECT, EXCEPT
  2. UNION ALL и UNION (стоимость удаления дубликатов)
  3. Выражения CASE и сводные запросы
  4. Шаблоны перекрёстных таблиц (PostgreSQL crosstab())
← Назад к SQL Academy