Инженер – Аналитика с помощью Power BI (страница 5)
$\text{FILTER}()$ — возвращает таблицу, отфильтрованную по условию.
$\text{CALCULATE}()$ — главная функция DAX. Вычисляет выражение в изменённом контексте фильтра.
4.3. Практические примеры формул DAX
Пример 1. Выручка с нарастающим итогом (YTD):
Выручка YTD =
CALCULATE(
[Выручка],
DATESYTD('Календарь'[Дата])
)
Пример 2. Рост продаж год к году (YoY Growth):
Рост YoY =
DIVIDE(
[Выручка] - [Выручка Прошлый Год],
[Выручка Прошлый Год]
)
Пример 3. ABC‑анализ клиентов:
ABC-категория =
VAR CumulativeSales =
CALCULATE(
[Выручка],
FILTER(
ALLSELECTED(Клиенты),
[Выручка] >= EARLIER([Выручка])
)
)
VAR TotalSales = CALCULATE([Выручка], ALLSELECTED(Клиенты))
RETURN
SWITCH(
TRUE(),
CumulativeSales / TotalSales <= 0{,}8, "A",
CumulativeSales / TotalSales <= 0{,}95, "B",
"C"
)
Пример 4. Скользящее среднее за 7 дней:
Скользящее Среднее 7д =
AVERAGEX(
DATESINPERIOD('Календарь'[Дата], LASTDATE('Календарь'[Дата]), -7, DAY),
[Выручка]
)
DAX имеет встроенные функции для работы с датами:
$\text{SAMEPERIODLASTYEAR}()$ — данные за тот же период прошлого года.
$\text{PREVIOUSMONTH}()$, $\text{PREVIOUSQUARTER}()$ — предыдущий месяц/квартал.
$\text{TOTALMTD}()$, $\text{TOTALQTD}()$, $\text{TOTALYTD}()$ — нарастающие итоги с начала месяца/квартала/года.
Важно: для корректной работы функций времени нужна таблица‑календарь с непрерывными датами. Создайте её с помощью формулы:
Календарь = CALENDAR(DATE(2020, 1, 1), DATE(2030, 12, 31))
Понимание контекста — ключ к правильному использованию DAX:
Контекст строки: вычисление формулы для каждой строки таблицы (актуально для вычисляемых столбцов).
Контекст фильтра: применение фильтров из визуализаций, срезов или функций $\text{CALCULATE}()$.
Ошибка новичков: попытка использовать SUM(Столбец) в вычисляемом столбце без учёта контекста. Всегда проверяйте, где создаётся формула — в столбце или мере.
Советы по отладке:
Разбивайте сложные формулы на части с использованием VAR (временные переменные).
Проверяйте результат каждой части отдельно.
Используйте функцию $\text{ISBLANK}()$ для обработки пустых значений.
Избегайте вложенных функций $\text{FILTER}()$ без необходимости — они замедляют расчёт.
Оптимизация:
заменяйте $\text{FILTER}(ALL(<таблица>), <условие>)$ на $\text{REMOVEFILTERS}() + \text{FILTER}()$;
используйте $\text{KEEPFILTERS}()$, если нужно сохранить существующие фильтры;
минимизируйте количество вычисляемых столбцов — предпочитайте меры.
Задача: создать меры для анализа динамики продаж и рентабельности с использованием DAX.
Данные: модель из Главы 2 («Клиенты» и «Заказы») + таблица «Календарь» с полями: Дата, Месяц, Квартал, Год.
Шаги: