Базовый курс дал интуицию time intelligence. Здесь — рабочий набор приёмов, которыми закрывается почти любая временная задача. Все примеры — на нашем наборе с помеченной таблицей Календарь. Структура и формулы опираются на каноничные DAX Patterns Марко Руссо и Альберто Феррари.
Сквозной учебный набор — это продажи за один 2026 год. Поэтому меры «прошлый год» (PY, YoY) на нём вернут пусто — сравнивать не с чем. Здесь они показаны как шаблоны формул: на реальном наборе с историей в 2+ года они сразу заработают.
Два способа сдвига: «обёртка» и «таблица дат»
У TI-функций два стиля, и полезно видеть оба.
Готовые обёртки — короткие, но менее гибкие:
Выручка YTD = TOTALYTD ( [Выручка], Календарь[Дата] )
Выручка ПГ = CALCULATE ( [Выручка], SAMEPERIODLASTYEAR ( Календарь[Дата] ) )
Через таблицу дат внутри CALCULATE — длиннее, но управляемо и единообразно:
Выручка YTD =
CALCULATE ( [Выручка], DATESYTD ( Календарь[Дата] ) )
Выручка ПГ =
CALCULATE ( [Выручка], DATEADD ( Календарь[Дата], -1, YEAR ) )
Привыкайте к стилю CALCULATE ( [мера], DATES… ). Он единообразен (всегда «считай меру в этом наборе дат»), читается предсказуемо и легко комбинируется с другими фильтрами. Обёртки вроде TOTALYTD — синтаксический сахар поверх него.
Сравнения с прошлым
Выручка YoY = [Выручка] - [Выручка ПГ]
Выручка YoY % = DIVIDE ( [Выручка] - [Выручка ПГ], [Выручка ПГ] )
DATEADD сдвигает на произвольный шаг: -1, MONTH (к прошлому месяцу), -1, QUARTER (к прошлому кварталу). PARALLELPERIOD похож, но возвращает период целиком — удобно для «весь прошлый год» независимо от выбранного дня.
Накопительные и скользящие окна
Выручка QTD = CALCULATE ( [Выручка], DATESQTD ( Календарь[Дата] ) )
Выручка MTD = CALCULATE ( [Выручка], DATESMTD ( Календарь[Дата] ) )
Выручка за 90 дней =
CALCULATE (
[Выручка],
DATESINPERIOD ( Календарь[Дата], MAX ( Календарь[Дата] ), -90, DAY )
)
DATESINPERIOD — окно «N единиц назад от даты», основа скользящих средних. DATESBETWEEN — произвольный интервал между двумя датами, когда нужен полный контроль над границами.
Скользящее среднее
Средняя выручка за 3 мес =
VAR _Window = DATESINPERIOD ( Календарь[Дата], MAX ( Календарь[Дата] ), -3, MONTH )
RETURN
DIVIDE (
CALCULATE ( [Выручка], _Window ),
CALCULATE ( DISTINCTCOUNT ( Календарь[ГодМесяц] ), _Window )
)
Делим сумму за окно на число месяцев в окне — получаем среднее за месяц по последним трём.
Нестандартный (финансовый, недельный) календарь
Стандартные TI-функции предполагают григорианский год. Если год финансовый или учёт ведётся по неделям (4-4-5), обёртки не подойдут — границы периодов считают вручную через DATESBETWEEN по своим столбцам календаря (номер недели, финансовый период). У SQLBI это отдельные паттерны: month-related, week-related, custom calendars.
Выручка с начала фин. года =
CALCULATE (
[Выручка],
DATESYTD ( Календарь[Дата], "30/06" ) -- фин. год заканчивается 30 июня
)
Стандартные TI-меры собираются по шаблонам — забрать готовую (PY, YoY, YTD, скользящее) с подстановкой ваших таблиц можно в нашем генераторе DAX-мер. А когда временных мер становится много, весь набор (YTD, PY, YoY, скользящее) заменяют одной группой вычислений — этому посвящён отдельный урок в третьем, экспертном курсе.
На сквозном наборе (продажи только за 2026 год) постройте [Выручка] по месяцам, рядом — YTD и меру прошлого года (SAMEPERIODLASTYEAR). Что покажут YTD в декабре и мера прошлого года?
Показать ответ
YTD в декабре = 9 826 588 ₽ — годовой итог (YTD копит с начала года). Мера прошлого года везде пустая: данных за 2025 в наборе нет, сравнивать не с чем. Это не ошибка формулы — на одногодичном наборе PY/YoY и должны быть пустыми. На реальном наборе с историей 2+ лет они сразу заработают.
Что дальше
Время освоили. Но что, если у факта две даты — заказа и отгрузки — и обе надо анализировать по одному календарю? Для этого нужны активные и неактивные связи. Следующий урок.