Итераторы 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 «замораживает» контекст в точке объявления — это защищает от ошибок при смене контекста.