Урок 14 · 16 мин чтения

Финансовые меры — план-факт, динамика и почему проценты не суммируются

Отклонения план-факт в деньгах и процентах, динамика к прошлому периоду и YTD, нарастающий денежный поток — на DAX. И главная ловушка: почему маржу и любой процент нельзя складывать и усреднять, а нужно пересчитывать заново.

Над базовой мерой результата (из прошлого урока) надстраивается то, ради чего вообще строят финансовый дашборд: сравнение с планом, динамика во времени, нарастающие итоги. Здесь же лежит ошибка, которую совершают почти все новички, — суммирование процентов. Разберём с DAX.

Идея урока

Дать рабочие паттерны DAX для финансовых мер и объяснить фундаментальное правило: проценты, маржу, доли нельзя агрегировать суммой или средним — их пересчитывают из числителя и знаменателя на каждом уровне.

План-факт: отклонение в деньгах и процентах

План и факт лежат в одной факт-таблице, разделённые измерением Сценарий. Меры:

Факт = CALCULATE ( [Результат P&L], Сценарий[Сценарий] = "Факт" )
План = CALCULATE ( [Результат P&L], Сценарий[Сценарий] = "План" )

Отклонение ₽ = [Факт] - [План]

Отклонение % = DIVIDE ( [Факт] - [План], [План] )
Всегда DIVIDE, а не «/»

DIVIDE безопасно обрабатывает деление на ноль (вернёт пусто или заданное значение), тогда как обычное / даёт ошибку и «ломает» визуал в строках, где план нулевой. В финансах нулевые знаменатели — обычное дело (новая статья, закрытое направление), поэтому DIVIDE — стандарт.

Для расходов знак отклонения интерпретируется обратно: перерасход (факт > плана) — это плохо. Это решают либо отдельной мерой «благоприятность», либо условным форматированием по типу статьи — но не переписыванием знака в данных (см. прошлый урок).

Динамика: к прошлому периоду и нарастающим итогом

Для time intelligence нужна отдельная таблица-календарь, помеченная как таблица дат. Тогда:

Факт ПГ = CALCULATE ( [Факт], SAMEPERIODLASTYEAR ( Календарь[Дата] ) )

Прирост % к ПГ = DIVIDE ( [Факт] - [Факт ПГ], [Факт ПГ] )

Факт YTD = TOTALYTD ( [Факт], Календарь[Дата] )

SAMEPERIODLASTYEAR сдвигает контекст на год назад, TOTALYTD накапливает с начала года. Финансовый год не всегда календарный — у TOTALYTD есть параметр даты окончания года (например, "31-03"), это частый нюанс для компаний с нестандартным финансовым годом.

Нарастающий денежный поток

Остаток денег — это накопление потоков. Нарастающий итог считается фильтром «всё до текущей даты»:

Чистый поток = [Поступления] - [Платежи]

Накопленный остаток =
CALCULATE (
    [Чистый поток],
    FILTER ( ALL ( Календарь ), Календарь[Дата] <= MAX ( Календарь[Дата] ) )
) + [Остаток на начало]

Это основа прогноза кассовых разрывов: на графике видно, в какую дату накопленный остаток уходит в минус.

Главная ловушка: проценты и маржу нельзя суммировать

Вот ошибка, которая выглядит безобидно и почти всегда проходит незамеченной.

Сумма процентов — это не процент, а бессмыслица

Если в таблице по месяцам стоит маржа 20%, 25%, 30%, то итог за квартал — не 75% (сумма) и не 25% (среднее). Маржа за квартал — это прибыль за квартал / выручка за квартал, и она зависит от того, в каких месяцах было больше выручки. То же с любым относительным показателем: рентабельность, доля рынка, конверсия, средний чек, процент выполнения плана. Нельзя складывать. Нельзя усреднять среднее.

Правильный паттерн — пересчитывать процент из числителя и знаменателя на каждом уровне:

Маржа % = DIVIDE ( [Прибыль], [Выручка] )

Эта мера сама даёт верный процент и в строке месяца, и в итоге квартала, и в общем итоге — потому что и [Прибыль], и [Выручка] пересчитываются под текущий контекст фильтра. Никогда не делайте AVERAGE(Таблица[Маржа%]) или меру поверх вычисленной колонки с процентом.

Взвешенное среднее: когда «среднее» всё-таки нужно

Если действительно нужно среднее значение показателя — оно почти всегда взвешенное, а не простое. Средняя цена продажи по компании — это выручка / количество, а не среднее цен по сделкам. Средняя ставка по кредитам — сумма процентов / сумма долга, а не среднее ставок. Простое среднее (AVERAGE) игнорирует объёмы и завышает вклад мелких позиций. Правило: средняя величина считается как отношение двух суммируемых мер, а не усреднением уже посчитанных отношений.

Числовой пример обмана простого среднего: январь — выручка 1000, маржа 10%; февраль — выручка 100, маржа 50%. Простое среднее маржи = 30%. А правда: прибыль 100 + 50 = 150, выручка 1100, маржа = 150/1100 = 13,6%. Простое среднее завысило вдвое, потому что дало мелкому февралю тот же вес, что и крупному январю.

Чек-лист финансовых мер

  • Базовый результат — SUMX со знаком (урок 13), а не SUM.
  • Деление — только DIVIDE.
  • Проценты/маржа — DIVIDE(числитель, знаменатель), пересчёт на каждом уровне; никогда не суммировать и не усреднять проценты.
  • Средние — взвешенные (отношение сумм), а не AVERAGE отношений.
  • Динамика — через time intelligence на отдельном календаре, с учётом финансового года.
  • Остатки — «значение на конец», обороты — сумма; не путать (урок 12).

Что дальше

Меры готовы. Но даже корректная мера ломается на стыке данных: когда смешивают начисления и кассу, когда внутри группы компаний есть взаимные обороты, когда валют несколько. Эти ловушки агрегации — следующий урок, последний в модуле о модели данных.

По месяцам маржа 10% (выручка 1000) и 50% (выручка 100). Какая маржа за два месяца вместе?
Маржу нельзя ни складывать, ни усреднять. Правильно: суммировать прибыль (100+50=150) и выручку (1000+100=1100), затем разделить: 150/1100 = 13,6%. Простое среднее (30%) завышает, потому что даёт мелкому февралю тот же вес, что крупному январю. В DAX это мера DIVIDE([Прибыль],[Выручка]), пересчитываемая на каждом уровне.
Прогресс сохраняется в вашем браузере.
§ Power BI под ключ

Нужно внедрить
это в компании?

Соберём DWH, модель и дашборды под ваши данные. Бесплатная консультация — 30 минут.

Телефон+7 918 042 34 43