Контекст строки и контекст фильтра

Разбираем два контекста DAX — без них невозможно понять CALCULATE.

Контекст — это «обстоятельства расчёта»: какие строки видны формуле в данный момент. В DAX их два: контекст строки и контекст фильтра.

Зачем понимать контекст

DAX кажется магией ровно до тех пор, пока не поймёшь контекст. Девяносто процентов вопросов «почему меры показывают не то» сводятся к контексту. Это не дополнительная тема, а сама механика языка: значение любой формулы определяется тем, в каком контексте она выполняется.

Контекст строки

Контекст строки означает: «сейчас мы находимся на конкретной строке таблицы». Он возникает в двух местах: в вычисляемом столбце (для каждой строки) и внутри функций-итераторов (SUMX и подобных), которые проходят таблицу строку за строкой. В этом контексте формула видит значения столбцов текущей строки.

Контекст строки (идём по таблице Sales):
┌────┬─────┬──────┐
│ qty│price│ ...  │   на каждой строке доступны qty и price
├────┼─────┼──────┤   именно ЭТОЙ строки
│  2 │ 100 │ ◄──── текущая строка: qty=2, price=100
│  3 │  90 │
└────┴─────┴──────┘

Контекст фильтра

Контекст фильтра — это набор всех активных фильтров в момент расчёта: выбор в срезах, ячейка таблицы/матрицы (она задаёт неявный фильтр по своей строке и столбцу), фильтры страницы и визуала. Мера всегда считается в контексте фильтра: «сложи выручку для того, что сейчас выбрано».

Матрица: мера [Выручка] в ячейке
              Москва   СПб
  Электроника  ▣ ◄── контекст фильтра этой ячейки:
  Одежда            регион=Москва И категория=Электроника
  → [Выручка] здесь = сумма ТОЛЬКО таких строк

Как они сочетаются

Контекст строкиКонтекст фильтра
Что задаёттекущую строкувидимый набор строк
Где возникаетстолбцы, итераторы (SUMX)срезы, ячейки, фильтры
Кто меняетSUMX, FILTERCALCULATE

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

Когда визуал просит значение меры, движок сначала собирает контекст фильтра (всё выбранное плюс «координаты» текущей ячейки), затем сужает таблицы по связям и считает выражение. Если внутри есть итератор, он добавляет контекст строки поверх: для каждой строки выполняет выражение в её контексте строки, но в общем контексте фильтра. Ключевой нюанс: контекст строки сам по себе не фильтрует связанные таблицы — для этого его нужно «превратить» в фильтр (это делает CALCULATE, следующий урок).

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

  • Ожидать, что итог по группе равен сумме строк. Итоговая ячейка имеет свой контекст фильтра (вся группа), и мера там считается заново, а не складывает строки.
  • Думать, что контекст строки видит «соседние» строки. Он видит только текущую; для агрегата нужен итератор или мера.
  • Игнорировать неявный фильтр ячейки. Каждая ячейка матрицы — это отдельный контекст фильтра.

Итог

  • Контекст строки — «мы на этой строке» (столбцы, итераторы); видит значения текущей строки.
  • Контекст фильтра — «что выбрано» (срезы, ячейки, фильтры); определяет видимый набор строк.
  • Мера всегда считается в контексте фильтра; контекст строки добавляют итераторы.
Проверьте себя
1. Где возникает контекст строки?
AВ срезах отчёта
BВ вычисляемых столбцах и итераторах вроде SUMX
CТолько в дашбордах
DВ настройках публикации
2. Что формирует контекст фильтра у меры?
AЦвет визуала
BСрезы, фильтры и текущая ячейка таблицы/матрицы
CИмя таблицы
DТип данных столбца