Над базовой мерой результата (из прошлого урока) надстраивается то, ради чего вообще строят финансовый дашборд: сравнение с планом, динамика во времени, нарастающие итоги. Здесь же лежит ошибка, которую совершают почти все новички, — суммирование процентов. Разберём с DAX.
Дать рабочие паттерны DAX для финансовых мер и объяснить фундаментальное правило: проценты, маржу, доли нельзя агрегировать суммой или средним — их пересчитывают из числителя и знаменателя на каждом уровне.
План-факт: отклонение в деньгах и процентах
План и факт лежат в одной факт-таблице, разделённые измерением Сценарий. Меры:
Факт = CALCULATE ( [Результат P&L], Сценарий[Сценарий] = "Факт" )
План = CALCULATE ( [Результат P&L], Сценарий[Сценарий] = "План" )
Отклонение ₽ = [Факт] - [План]
Отклонение % = 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).
Что дальше
Меры готовы. Но даже корректная мера ломается на стыке данных: когда смешивают начисления и кассу, когда внутри группы компаний есть взаимные обороты, когда валют несколько. Эти ловушки агрегации — следующий урок, последний в модуле о модели данных.