В прошлом уроке мы написали меру Выручка = SUM ( Продажи[Сумма] ) — и она сама пересчиталась под срез по региону. Как? Ответ — контекст фильтра. Это главная идея DAX; поняв её, вы понимаете девяносто процентов остального.
Мера считается не один раз
Кажется, что мера выдаёт «одно число». На самом деле она считается заново для каждой ячейки, где появляется. И каждый раз — под свой набор фильтров.
Положите выручку в таблицу по регионам:
| Регион | Выручка |
|---|---|
| ЦФО | 1 240 |
| ПФО | 880 |
| ЮФО | 560 |
| Итого | 2 680 |
SUM ( Продажи[Сумма] ) тут посчитался четыре раза. В строке «ЦФО» — только по продажам ЦФО. В строке «ПФО» — только по ПФО. В «Итого» — по всем. Формула одна, числа разные, потому что окружение у каждой ячейки своё.
Цифры в таблице — условные, для наглядности механики. На сквозном наборе курса (его мы качали в уроке про набор данных) выручка крупнее — ЦФО ≈ 2,5 млн ₽, итог ≈ 9,8 млн ₽; сверяться с этими значениями будем в уроках про функции агрегации.
Что создаёт контекст
Это окружение — набор активных фильтров — и называется контекстом фильтра. Его формируют:
- строки и столбцы визуала (регион в строке таблицы);
- срезы (slicer по дате, по категории);
- другие визуалы на странице (кликнули по столбику — отфильтровали остальные);
- сама мера, если внутри неё есть
CALCULATE(об этом ниже).
Мера не считает «всё подряд». Она считает то, что видно в текущем контексте. Регион в строке, июль в срезе, клик по графику — всё это сужает данные ещё до того, как SUM берётся за работу.
Почему «Итого» — не сумма строк
Частый шок новичка: мера в строке «Итого» иногда не равна сумме строк выше. Это не баг.
«Итого» — это та же мера, посчитанная в контексте «все строки сразу», а не сложение результатов по строкам. Для простой суммы итог совпадёт. Но для меры вроде «% выполнения плана» или «средний чек» итог считается по своей логике — и он правильный, просто это не арифметическая сумма ячеек.
Если итог «не сходится» — почти всегда это не ошибка, а напоминание: мера в каждой ячейке (включая итоговую) пересчитывается под свой контекст.
CALCULATE — когда контекст меняют намеренно
Иногда контекст нужно поменять прямо в мере. Например, посчитать выручку только по молочке независимо от того, что выбрано в отчёте. Для этого есть CALCULATE — функция, которая меняет фильтры перед расчётом:
Выручка по молочке =
CALCULATE ( [Выручка], Товары[Категория] = "Молочка" )
CALCULATE — самая мощная функция DAX, и почти все продвинутые меры строятся на ней. Но фундамент под ней — тот самый контекст фильтра. Освоили идею «мера считается под текущие фильтры» — дальше CALCULATE ложится естественно.
Что дальше
Данные разложены, связаны, посчитаны. Пора показать их человеку. В следующем уроке — как выбирать график под задачу, а не по привычке тянуться к круговой.