Что такое DAX и базовые функции

Знакомимся с языком формул DAX и его базовыми агрегатными функциями.

DAX (Data Analysis Expressions) — язык формул Power BI для вычисления показателей поверх модели данных.

Что такое DAX и зачем он

Модель и визуализации показывают данные, но настоящие показатели — выручку, средний чек, конверсию, рост — нужно посчитать. Для этого служит DAX. Внешне его формулы напоминают функции Excel (SUM, IF, AVERAGE), но работают они не над ячейками, а над столбцами и таблицами целиком, с учётом текущего фильтра отчёта. Это смещение от «ячейки» к «столбцу в контексте» — главное, что нужно перестроить в голове после Excel.

Синтаксис

Формула DAX обращается к столбцу через имя таблицы и столбца в квадратных скобках:

Выручка = SUM( Sales[amount] )

Количество заказов = COUNTROWS( Sales )

Средний чек = DIVIDE( SUM(Sales[amount]), COUNTROWS(Sales) )

Здесь Sales[amount] — столбец «сумма» в таблице Sales. Функция SUM складывает все его значения в текущем фильтре: если на отчёте выбран регион «Юг» и июнь, сложатся только подходящие строки.

Базовые агрегатные функции

ФункцияЧто делает
SUMсумма значений столбца
AVERAGEсреднее значение
MIN / MAXминимум / максимум
COUNTчисло непустых значений столбца
COUNTROWSчисло строк таблицы
DISTINCTCOUNTчисло уникальных значений

Особняком стоит DIVIDE — безопасное деление: DIVIDE(a, b) вернёт пусто (а не ошибку) при делении на ноль. В аналитике делений много (доли, средние, конверсии), поэтому DIVIDE используют всегда вместо оператора /.

Маленькая иллюстрация логики агрегата

Чтобы прочувствовать, что делает SUM по столбцу, посмотрим на чистом Python (DAX не исполняется в браузере):

amounts = [100, 250, 90, 320, 150]
print("Выручка (SUM):", sum(amounts))
print("Средний чек (AVERAGE):", round(sum(amounts) / len(amounts), 2))
print("Заказов (COUNTROWS):", len(amounts))

Вывод:

Выручка (SUM): 910
Средний чек (AVERAGE): 182.0
Заказов (COUNTROWS): 5

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

Когда вы кладёте меру Выручка на карточку, Power BI определяет текущий контекст фильтра (что выбрано в срезах, на какой ячейке таблицы считаем), сужает столбец Sales[amount] до подходящих строк и складывает их движком VertiPaq. Один и тот же DAX даёт разные числа в разных местах отчёта — потому что меняется контекст. Эта зависимость от контекста — суть DAX, и ей посвящён отдельный урок.

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

  • Делить через / вместо DIVIDE. Ноль в знаменателе даст ошибку и «сломает» визуал.
  • Считать DAX «как Excel по ячейкам». DAX работает над столбцами в контексте, а не над отдельными клетками.
  • Путать COUNT и COUNTROWS. Первая считает непустые значения столбца, вторая — строки таблицы.

Итог

  • DAX считает показатели поверх модели, работая над столбцами в текущем фильтре.
  • Базовые функции: SUM, AVERAGE, COUNTROWS, DISTINCTCOUNT; деление — через DIVIDE.
  • Одна и та же мера даёт разные числа в разных местах — из-за контекста фильтра.
Проверьте себя
1. Почему деление в DAX делают через DIVIDE, а не через оператор /?
ADIVIDE быстрее печатать
BDIVIDE безопасно обрабатывает деление на ноль (возвращает пусто)
CОператор / запрещён
DЭто одно и то же
2. Почему одна и та же мера показывает разные числа в разных местах отчёта?
AИз-за случайности
BИз-за разного контекста фильтра
CМеры всегда одинаковы
DИз-за цвета визуала