Итераторы SUMX и переменные VAR

Считаем построчно через SUMX и наводим порядок в формулах с помощью VAR.

Итератор (X-функция) проходит таблицу строка за строкой, считает выражение в каждой и агрегирует результаты; VAR объявляет промежуточную переменную в формуле.

Зачем нужны итераторы

Обычный SUM складывает готовый столбец. Но часто нужно сначала посчитать что-то в каждой строке, а потом сложить. Классика — выручка как «количество × цена», когда отдельного столбца «итог» нет. Складывать тут нечего — сумму надо вычислить построчно. Для этого служат итераторы, оканчивающиеся на X: SUMX, AVERAGEX, MAXX, COUNTX.

Выручка = SUMX( Sales, Sales[quantity] * Sales[price] )

Как это работает: SUMX создаёт контекст строки, идёт по таблице Sales, в каждой строке вычисляет quantity * price, и в конце складывает все результаты. Это две операции в одной: построчный расчёт + агрегация.

SUMX по Sales (qty * price):
  строка 1: 2 * 100 = 200
  строка 2: 3 *  90 = 270
  строка 3: 1 * 320 = 320
  ─────────────────────────
  Σ итог            = 790

Иллюстрация на Python

Та же логика «посчитать в строке, потом сложить» на чистом Python:

sales = [(2, 100), (3, 90), (1, 320)]  # (количество, цена)
revenue = sum(qty * price for qty, price in sales)
print("Выручка (аналог SUMX):", revenue)

Вывод:

Выручка (аналог SUMX): 790

Переменные VAR

Сложные формулы становятся нечитаемыми и медленными, если повторять одно и то же выражение. VAR вычисляет значение один раз, даёт ему имя и переиспользует. После блока VAR обязателен RETURN с итоговым выражением.

Рост к прошлому году % =
VAR Текущий = [Выручка]
VAR Прошлый = CALCULATE( [Выручка], SAMEPERIODLASTYEAR(Date[Дата]) )
VAR Разница = Текущий - Прошлый
RETURN
    DIVIDE( Разница, Прошлый )

Без переменных пришлось бы трижды писать [Выручка] и дважды CALCULATE — формула раздулась бы и считалась дольше.

Чем хорош VAR

ПользаПочему
Читаемостьосмысленные имена вместо вложенности
Скоростьвыражение считается один раз
Отладкаможно временно вернуть промежуточный VAR
Защита от контекстаVAR «замораживает» значение в момент объявления

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

Важнейшая тонкость: переменная VAR вычисляется в том контексте, где объявлена, и больше не меняется. Это спасает от хитрых ошибок: если внутри последующего CALCULATE контекст изменится, переменная сохранит «старое» значение, которое вы и хотели. Итераторы же на каждой строке заново создают контекст строки — поэтому SUMX и видит значения текущей строки. Понимание, где «заморожен» контекст, а где он живой, — признак зрелого DAX-разработчика.

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

  • Использовать SUM там, где нужен SUMX. Нельзя сложить несуществующий столбец «итог» — нужно посчитать его построчно.
  • Забыть RETURN после VAR. Блок переменных обязан завершаться возвращаемым выражением.
  • Ожидать, что VAR «увидит» новый контекст. Переменная заморожена в точке объявления — это фича, а не баг.

Итог

  • Итераторы (SUMX и др.) считают выражение построчно и затем агрегируют — для расчётов вроде «кол-во × цена».
  • VAR делает формулы читаемее и быстрее, вычисляя значение один раз; завершается RETURN.
  • VAR «замораживает» контекст в точке объявления — это защищает от ошибок при смене контекста.
Проверьте себя
1. Когда нужен SUMX вместо SUM?
AНикогда, они одинаковы
BКогда нужно посчитать выражение построчно (например, кол-во × цена), а готового столбца нет
CТолько для текста
DКогда данных мало
2. В каком контексте вычисляется переменная VAR?
AВ любом будущем контексте
BВ контексте, где она объявлена, и больше не меняется
CВсегда без фильтров
DВ контексте визуала после показа