Контекст строки и контекст фильтра
Разбираем два контекста DAX — без них невозможно понять CALCULATE.
Контекст — это «обстоятельства расчёта»: какие строки видны формуле в данный момент. В DAX их два: контекст строки и контекст фильтра.
Зачем понимать контекст
DAX кажется магией ровно до тех пор, пока не поймёшь контекст. Девяносто процентов вопросов «почему меры показывают не то» сводятся к контексту. Это не дополнительная тема, а сама механика языка: значение любой формулы определяется тем, в каком контексте она выполняется.
Контекст строки
Контекст строки означает: «сейчас мы находимся на конкретной строке таблицы». Он возникает в двух местах: в вычисляемом столбце (для каждой строки) и внутри функций-итераторов (SUMX и подобных), которые проходят таблицу строку за строкой. В этом контексте формула видит значения столбцов текущей строки.
Контекст строки (идём по таблице Sales): ┌────┬─────┬──────┐ │ qty│price│ ... │ на каждой строке доступны qty и price ├────┼─────┼──────┤ именно ЭТОЙ строки │ 2 │ 100 │ ◄──── текущая строка: qty=2, price=100 │ 3 │ 90 │ └────┴─────┴──────┘
Контекст фильтра
Контекст фильтра — это набор всех активных фильтров в момент расчёта: выбор в срезах, ячейка таблицы/матрицы (она задаёт неявный фильтр по своей строке и столбцу), фильтры страницы и визуала. Мера всегда считается в контексте фильтра: «сложи выручку для того, что сейчас выбрано».
Матрица: мера [Выручка] в ячейке
Москва СПб
Электроника ▣ ◄── контекст фильтра этой ячейки:
Одежда регион=Москва И категория=Электроника
→ [Выручка] здесь = сумма ТОЛЬКО таких строкКак они сочетаются
| Контекст строки | Контекст фильтра | |
| Что задаёт | текущую строку | видимый набор строк |
| Где возникает | столбцы, итераторы (SUMX) | срезы, ячейки, фильтры |
| Кто меняет | SUMX, FILTER | CALCULATE |
Как работает под капотом
Когда визуал просит значение меры, движок сначала собирает контекст фильтра (всё выбранное плюс «координаты» текущей ячейки), затем сужает таблицы по связям и считает выражение. Если внутри есть итератор, он добавляет контекст строки поверх: для каждой строки выполняет выражение в её контексте строки, но в общем контексте фильтра. Ключевой нюанс: контекст строки сам по себе не фильтрует связанные таблицы — для этого его нужно «превратить» в фильтр (это делает CALCULATE, следующий урок).
Частые ошибки
- Ожидать, что итог по группе равен сумме строк. Итоговая ячейка имеет свой контекст фильтра (вся группа), и мера там считается заново, а не складывает строки.
- Думать, что контекст строки видит «соседние» строки. Он видит только текущую; для агрегата нужен итератор или мера.
- Игнорировать неявный фильтр ячейки. Каждая ячейка матрицы — это отдельный контекст фильтра.
Итог
- Контекст строки — «мы на этой строке» (столбцы, итераторы); видит значения текущей строки.
- Контекст фильтра — «что выбрано» (срезы, ячейки, фильтры); определяет видимый набор строк.
- Мера всегда считается в контексте фильтра; контекст строки добавляют итераторы.