Сравнение год-к-году (YoY)

Сравниваем текущий период с тем же периодом прошлого года — ключевая метрика роста.

Год-к-году (YoY, year-over-year) — сравнение показателя текущего периода с аналогичным периодом прошлого года.

Зачем сравнивать с прошлым годом

Абсолютная выручка мало о чём говорит без базы сравнения. «Июнь дал 180» — это хорошо или плохо? Сравнение с прошлым июнем сразу отвечает: выросли мы или упали. YoY гасит сезонность (декабрь всегда выше июля, нечестно сравнивать соседние месяцы) и показывает реальную динамику. Это первая метрика, которую спрашивает бизнес.

SAMEPERIODLASTYEAR

Сердце расчёта — функция, которая сдвигает текущий период ровно на год назад:

Выручка ПГ = CALCULATE(
    [Выручка],
    SAMEPERIODLASTYEAR( Date[Дата] )
)

«ПГ» — прошлый год. Если текущий контекст — июнь 2026, функция вернёт даты июня 2025, и CALCULATE посчитает выручку за них. Альтернатива — DATEADD(Date[Дата], -1, YEAR), более гибкая (можно сдвигать на месяц/квартал/день).

Прирост в процентах

Дальше считают абсолютный и относительный прирост — тут пригодятся переменные:

Прирост YoY % =
VAR Текущий = [Выручка]
VAR Прошлый = CALCULATE( [Выручка], SAMEPERIODLASTYEAR(Date[Дата]) )
RETURN
    DIVIDE( Текущий - Прошлый, Прошлый )
Месяц   Выручка 2026  Выручка 2025  Прирост YoY
Янв        100           80          +25%
Фев        150          120          +25%
Мар        120          150          −20%
Апр         90          100          −10%

Иллюстрация формулы прироста

current = 120
prev = 150
growth = (current - prev) / prev
print("Прирост YoY:", round(growth * 100, 1), "%")

Вывод:

Прирост YoY: -20.0 %

Как работает под капотом

SAMEPERIODLASTYEAR берёт набор дат из текущего контекста фильтра, сдвигает каждую на год назад и возвращает новый набор, который CALCULATE использует как фильтр. Поэтому функция корректно работает на любом уровне — день, месяц, квартал, год: она просто переносит «видимый» период на 365/366 дней назад по таблице дат. Без полноценной таблицы дат сдвиг невозможен.

Частые ошибки

  • Делить на ноль в прошлом периоде. Если год назад продаж не было, используйте DIVIDE — оно вернёт пусто вместо ошибки.
  • Сравнивать неполный текущий период с полным прошлым. Если текущий месяц ещё не закончился, YoY будет занижен — это нужно учитывать в интерпретации.
  • Считать YoY без таблицы дат. Как и весь time intelligence, требует помеченного календаря.

Итог

  • YoY сравнивает период с тем же периодом год назад, гася сезонность.
  • SAMEPERIODLASTYEAR (или DATEADD) сдвигает период на год; прирост считают через DIVIDE.
  • Следите за делением на ноль и неполнотой текущего периода при интерпретации.
Проверьте себя
1. Что делает SAMEPERIODLASTYEAR?
AСчитает накопительный итог
BСдвигает текущий период ровно на год назад
CУдаляет фильтры
DСчитает среднее за год
2. Почему прирост YoY считают через DIVIDE?
AТак быстрее
BЧтобы избежать ошибки, если в прошлом году значение было нулевым
CDIVIDE округляет
DЭто требование лицензии