У вас 10 базовых мер (выручка, маржа, количество…) и для каждой нужны варианты: прошлый год, YTD, рост %, скользящее среднее. Это 10 × 5 = 50 почти одинаковых мер. Каждое исправление логики «прошлый год» — 10 правок. Calculation groups убирают этот ад: расчёт описывается один раз и применяется к любой мере. Опираемся на calculation groups в SQLBI.
Учебный набор: меры [Выручка], [Маржа], [Количество] и желание иметь для каждой PY, YTD, %рост — не плодя 9 отдельных мер.
Проблема, которую они решают
Без calculation groups time-intelligence пишут «в лоб»:
Выручка PY = CALCULATE ( [Выручка], SAMEPERIODLASTYEAR ( Календарь[Дата] ) )
Маржа PY = CALCULATE ( [Маржа], SAMEPERIODLASTYEAR ( Календарь[Дата] ) )
Кол-во PY = CALCULATE ( [Количество], SAMEPERIODLASTYEAR ( Календарь[Дата] ) )
Логика «прошлый год» дублируется в каждой мере. Поменялась бизнес-логика — правите везде. Не масштабируется.
Идея: расчёт как переменная-измерение
Calculation group — это таблица с пунктами расчёта (calculation items), каждый из которых — преобразование, применяемое к текущей мере. Внутри пункта мера обозначается плейсхолдером SELECTEDMEASURE().
Создаём группу «Время» с пунктами:
Текущий = SELECTEDMEASURE ()
PY = CALCULATE ( SELECTEDMEASURE (), SAMEPERIODLASTYEAR ( Календарь[Дата] ) )
YTD = CALCULATE ( SELECTEDMEASURE (), DATESYTD ( Календарь[Дата] ) )
% роста =
VAR _Cur = SELECTEDMEASURE ()
VAR _Py = CALCULATE ( SELECTEDMEASURE (), SAMEPERIODLASTYEAR ( Календарь[Дата] ) )
RETURN DIVIDE ( _Cur - _Py, _Py )
SELECTEDMEASURE() — это «та мера, к которой сейчас применяют группу». Пункт «PY» не знает, выручка это или маржа, — он оборачивает любую меру в контекст прошлого года. Поэтому одна группа из 4 пунктов даёт варианты для всех мер сразу: 3 меры × 4 пункта = 12 комбинаций без единой лишней меры.
Как это выглядит в отчёте
Пункты группы появляются как значения отдельного «измерения». Кладёте его, например, в столбцы матрицы, базовую меру — в значения. На пересечении Power BI применяет нужный пункт к выбранной мере. Один столбец-переключатель — и матрица показывает «Текущий / PY / YTD / %роста» для любой меры.
Чем создаются
Calculation groups не делаются в стандартном Power BI Desktop напрямую (исторически — только внешними инструментами; в свежих версиях появился базовый редактор). Рабочий инструмент — Tabular Editor (бесплатный TE2 или платный TE3): создаёте таблицу-группу, добавляете пункты с DAX, задаёте Ordinal для порядка и формат-стринги.
Format strings — важная деталь
Разные пункты могут требовать разный формат: «%роста» — это проценты, а «Текущий» — рубли. У calculation item есть dynamic format string — выражение формата, переопределяющее формат базовой меры:
-- для пункта «% роста»
Format String Expression = "0.0%"
Так одна и та же [Выручка] в пункте «Текущий» покажется как «1 234 ₽», а в «%роста» — как «12,3%».
- Precedence (приоритет). Если групп несколько (например, «Время» и «Валюта»), порядок их применения задаётся свойством Precedence — иначе результат непредсказуем.
- Боковые эффекты на простых мерах. Пункт применяется ко всему, включая меры, которым time-intelligence не нужен. Иногда нужен защитный код (проверка
ISSELECTEDMEASUREили возврат BLANK). - Не злоупотребляйте. Группа — мощный, но неочевидный механизм; новому человеку в модели её логику надо объяснять. Документируйте.
Что дальше
Механизм calculation groups освоили. Дальше — его главное применение: собрать весь time intelligence (YTD, PY, YOY, rolling) в один набор. Следующий урок.