1. Что такое DAX и зачем он нужен?
Представьте, что ваши данные в Power BI — это просто сырые ингредиенты. Панель полей — это нож, которым вы их нарезали. DAX — это плита и специи, которые позволяют вам приготовить новое, сложное блюдо из этих ингредиентов.
Примеры "блюд", которые готовит DAX:
- Посчитать продажи за предыдущий месяц.
- Вычислить процент выполнения плана.
- Создать показатель накопленного итога за год.
- Сгруппировать клиентов на новичков и постоянных.
Без DAX вы можете показать только то, что прямо есть в ваших данных. С DAX — вы можете показать то, что спрятано в ваших данных.
2. Где живут формулы DAX?
Есть два основных места, где вы будете писать формулы DAX:
Столбцы (Calculated Columns): Добавляют новый столбец в таблицу. Вычисляются для каждой строки и физически хранятся в модели (могут увеличивать размер файла).
Аналогия в Excel: Формула, протянутая на весь столбец.
Меры (Measures): Это ВАЖНЕЙШИЙ концепт. Меры не хранятся в таблице, а вычисляются «на лету» в контексте визуального элемента (графика, среза). Они динамичны.
Аналогия в Excel: СУММЕСЛИ или СВОДНАЯ ТАБЛИЦА. Результат зависит от того, какие ячейки выбраны.
> 90% вашей работы будет с МЕРАМИ.
Основные кирпичики любой формулы DAX
1. Синтаксис: НАЗВАНИЕ_ФУНКЦИИ( Аргумент1, Аргумент2, ... )
Очень похоже на Excel. Аргументами могут быть столбцы, другие меры, числа или выражения.
2. Столбцы в формулах: Вы всегда ссылаетесь на столбец не просто по имени, а указываете его таблицу. Это важно!
- Неправильно: [Выручка]
- Правильно: 'Продажи'[Выручка] или Продажи[Выручка]
3. Базовые функции, с которых нужно начать:
Это «золотая пятёрка», без которой никуда.
- SUM() — Сумма.
SUM( Продажи[Выручка] ) — Сумма выручки из столбца «Выручка» таблицы «Продажи».
- CALCULATE() — САМАЯ ВАЖНАЯ ФУНКЦИЯ в DAX. Она меняет контекст вычисления.
Аналогия в Excel: Магическая комбинация «СУММЕСЛИ» и «Фильтр».
CALCULATE( [Мера], Условие1, Условие2, ... )
Пример: CALCULATE( SUM(Продажи[Выручка]), 'Дата'[Год] = 2024 ) — Покажет сумму выручки, но только для 2024 года, даже если на дашборде выбран другой год.
- FILTER() — Фильтрует таблицу по заданному условию. Часто используется внутри CALCULATE.
FILTER( Таблица, Условие )
Пример: CALCULATE( [Общая Выручка], FILTER( 'Продажи', Продажи[Количество] > 10 ) ) — Выручка только по тем строкам, где количество больше 10.
- DIVIDE() — Умное деление. Лучше использовать его, чем символ /, потому что он автоматически обрабатывает деление на ноль.
DIVIDE( Числитель, Знаменатель, [Альтернативный_Результат] )
Пример: DIVIDE( SUM(Продажи[Выручка]), SUM(Продажи[Количество]) ) — Посчитает среднюю цену (выручка / кол-во), и если деление на 0, вернёт пустоту.
Функции для работы со временем (Time Intelligence) — «Магия времени»:
Эти функции работают ТОЛЬКО при наличии правильно настроенной таблицы дат.
- TOTALYTD() / TOTALQTD() / TOTALMTD() — Вычисляет итог с начала года / квартала / месяца.
TOTALYTD( SUM(Продажи[Выручка]), 'Календарь'[Дата] ) — Накопленная выручка с начала года.
- SAMEPERIODLASTYEAR() — Возвращает набор дат за аналогичный период прошлого года. Идеально для сравнения.
CALCULATE( [Выручка], SAMEPERIODLASTYEAR( 'Календарь'[Дата] ) ) — Выручка за аналогичный период прошлого года.
Пошаговый пример: Создаём свою первую меру
Задача: Мы хотим показывать не просто общую выручку, а долю каждой категории товаров в общей выручке.
ШАГ 1: cоздаём базовую меру «Общая Выручка»
1. В панели полей правой кнопкой мыши щёлкните по вашей таблице (например, «Продажи») и выберите «Новая мера».
2. В строке формул напишите:
dax
Copy
Download
Общая Выручка = SUM(Продажи[Выручка])
3. Нажмите Enter. Теперь в списке полей вашей таблицы появилась эта мера. Её можно использовать в любом графике.
ШАГ 2: cоздаём меру «Доля в Выручке» с помощью CALCULATE
1. Снова создайте новую меру.
2. Напишите формулу:
dax
Copy
Download
Доля в Выручке% =
DIVIDE(
SUM(Продажи[Выручка]), -- Наша выручка в текущем контексте (напр., для "Ноутбуков")
[Общая Выручка] -- Общая выручка по ВСЕМ товарам
)
Но это не сработает идеально... Почему?
ВНИМАНИЕ: КОНТЕКСТ!
На графике, где есть фильтр по «Товару», мера [Общая Выручка] тоже будет посчитана только для этого товара. Нам нужно «сбросить» фильтр по товару, чтобы получить общую сумму.
ШАГ 3: Исправляем меру. Используем CALCULATE и ALL
Функция ALL() убирает все фильтры, applied к указанной таблице или столбцу.
Исправляем нашу меру:
dax
Copy
Download
Доля в Выручке% =
DIVIDE(
SUM(Продажи[Выручка]),
CALCULATE( [Общая Выручка], ALL( 'Продажи'[Товар] ) ) -- Игнорируем фильтр по столбцу "Товар"
)
Теперь это работает "perfectly"!
- В числителе: выручка для конкретного товара (в контексте строки графика).
- В знаменателе: выручка по всем товарам (мы «сбросили» фильтр по товару с помощью ALL).
ШАГ 4: форматируем меру
Выделите новую меру на панели полей -> во вкладке «Моделирование» на ленте выберите формат «Процентный» с двумя знаками после запятой.
Краткий чек-лист для написания любой меры:
- Задача: что я хочу посчитать? (Накопленный итог, процент, сравнение с прошлым годом).
- Базовый агрегат: с чего начать? (SUM, AVERAGE, COUNT).
- Нужно ли изменить контекст? Если да, то вам нужен CALCULATE. Пример: «Посчитать выручку только для Москвы» -> CALCULATE( [Выручка], Город[Название] = "Москва" ).
- Проверить результат: всегда смотрите, как мера ведёт себя в разных визуальных элементах (на целом графике и при выборе в срезе).
Что делать дальше?
- Создайте отдельную таблицу Дат (календарь) — это критически важно для работы с Time Intelligence.
- Практикуйтесь на простых примерах: % от общего, сравнение с прошлым периодом, ранжирование.
- Используйте подсказки! Редактор DAX в Power BI имеет IntelliSense — он подсказывает названия функций и таблиц по мере ввода.
Конечно сразу сложно разобраться с таким объёмом информации. Но, когда вы начнёте практиковаться, всё постепенно встанет на свои места. Обязательно смотрите видео по данной тематике из открытых источников, и в процессе просмотра вы уже будете в каких-то моментах понимать, о чем идет речь!