PIVOT в SQL через CASE: как разложить метрики по колонкам
Как собрать широкую таблицу продуктовых показателей через условную агрегацию и понять, когда pivot удобнее длинного формата.
Содержание статьи
BI иногда ждёт одну строку на сегмент и отдельные колонки показателей. Ручное соединение нескольких агрегатов создаёт пропуски и разные знаменатели. Как вывести active, paid и churned users в одной строке на канал?
Сигнал в данных
Как вывести active, paid и churned users в одной строке на канал?
BI иногда ждёт одну строку на сегмент и отдельные колонки показателей. Ручное соединение нескольких агрегатов создаёт пропуски и разные знаменатели.
Для канала можно посчитать COUNT DISTINCT с FILTER по статусу и получить одну строку на канал. Так проще сравнить метрики, если их база зафиксирована.
Как устроен расчёт
Одна строка результата должна описывать одну сущность и один период. Перед агрегацией проверь, что исходные строки не повторяют объект и что фильтры не меняют знаменатель незаметно.
Собери единый user-level слой, затем применяй FILTER или CASE. Названия колонок должны отражать определение, а не только значение исходного статуса.
Если показатель строится по событиям, отдельно проверь повторную отправку, идентичность пользователя и часовой пояс. Если данные приходят из бизнес-системы, сопоставь техническое поле с тем, как команда реально принимает решение.
вопрос → объект → период → расчёт → проверка → решениеЛюбой пропущенный шаг может изменить смысл итогового числа.
Практический сценарий
Для канала можно посчитать COUNT DISTINCT с FILTER по статусу и получить одну строку на канал. Так проще сравнить метрики, если их база зафиксирована.
Не копируй пример в рабочий отчёт вслепую. Сначала замени названия таблиц и полей, проверь кардинальность связей и запиши, какие строки должны попасть в результат. Хорошая адаптация сохраняет логику, но делает допущения видимыми.
| Шаг | Что проверить | Зачем |
|---|---|---|
| Определение | объект и период | не менять вопрос |
| Расчёт | Пользователи | получить воспроизводимое число |
| Ревью | крайний случай и baseline | не перепутать шум с сигналом |
Контрольные случаи
Опасны разные базы для колонок, NULL вместо нуля и динамические категории, которые исчезают из фиксированной схемы.
Отдельно протестируй пустой результат, NULL, дубль, граничную дату и объект без связанной записи. Эти случаи не являются редкими исключениями: именно они чаще всего превращают рабочий показатель в красивую, но неверную цифру.
- Не смешивай зрелые и незрелые периоды без отдельной подписи.
- Не заменяй проверку качества тем, что запрос просто выполнился.
- Не делай причинный вывод из одного разреза.
Чтение визуализации
График здесь нужен не для украшения статьи. Он помогает увидеть форму сигнала: тренд, разрыв между сегментами, хвост распределения или этап, на котором теряется объект. Сначала прочитай оси и единицы, затем сравни с таблицей и только после этого формулируй вывод.
На визуализации «PIVOT в SQL через CASE: как разложить метрики по колонкам» сравнивай не только максимальное значение. Проверь, одинаковы ли базы, не скрыта ли неполная дата и не меняется ли знаменатель от категории к категории.
Условный учебный пример для проверки формы сигнала, а не данные конкретной компании.
Небольшое упражнение
Собери таблицу по каналам с тремя метриками и сравни её с длинным вариантом. Проверь, что сумма сегментов совпадает с общей базой.
После упражнения напиши вывод в двух версиях. Первая — техническая: какие строки и условия дали результат. Вторая — для команды: что изменилось, насколько это надёжно и какое действие стоит проверить. Если эти версии противоречат друг другу, вернись к определению показателя.
- Собери контрольный пример из пяти-десяти строк.
- Сверь итог с независимым способом расчёта.
- Проверь хотя бы один крайний случай.
- Зафиксируй дату, версию схемы и ограничение.
Что передать команде
Используй pivot для потребления в BI, но храни длинный слой как источник для новых разрезов и контроля.
Сильный аналитический материал не обещает абсолютной уверенности. Он показывает, как получить число, где оно может ошибиться и какое решение можно принять уже сейчас. Такой формат хорошо переносится в дашборд, SQL-тренажёр, собеседование и рабочее обсуждение с командой.
Материалы по теме
COUNT DISTINCT с условием: несколько продуктовых метрик в одном SQL
Как считать DAU, платящих и активированных пользователей одним запросом через FILTER и CASE, сохраняя общий знаменатель.
Условная агрегация в SQL: CASE, FILTER и метрики в одном запросе
Как считать несколько условий одним SQL-запросом: CASE WHEN, FILTER, конверсию, активность и guardrail-метрики без лишних проходов по данным.

SQL CASE, COALESCE и NULL: как не сломать сегменты и метрики
Разбираем NULL, CASE и COALESCE на задачах аналитика: как группировать пустые значения, создавать сегменты и показывать ноль вместо пропущенных данных.