CALCULATE в DAX: как меняется контекст фильтра

CALCULATE нужна, когда меру надо посчитать не в текущем наборе данных, а в специально изменённом контексте. Разберём это на продажах без магии и шаманства вокруг DAX.

Павел переставляет прозрачные фильтры перед одним расчётом и получает изменившийся результат
СУТЬ БЕЗ ШУМА

Самое главное — за секунды

Содержание статьи

Поймёте, что именно меняет CALCULATE, соберёте меру на понятном примере и сможете проверить, почему итог в карточке отличается от ожиданий.

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

Что это значит простыми словами

Представьте отчёт по продажам за март. В строке товара уже действуют два условия: март и конкретный товар. Мера CALCULATE([Выручка], Канал[Тип] = "Онлайн") сохраняет месяц и товар, но добавляет условие по каналу. Если фильтр по тому же столбцу уже был, новый фильтр обычно его заменит. Если нужно пересечение, применяют KEEPFILTERS. Поэтому CALCULATE лучше читать справа налево: сначала подготовили фильтры, затем посчитали выражение.

Формула и логика расчёта

Базовая запись: CALCULATE(выражение, фильтр 1, фильтр 2). Выражением обычно служит готовая мера. Фильтром может быть логическое условие, таблица или функция-модификатор вроде REMOVEFILTERS. Ещё одна важная роль CALCULATE — переход контекста: в строковом контексте она превращает текущую строку в фильтр. Для обычной меры внутри визуала это часто происходит незаметно, а в вычисляемых столбцах и итераторах уже имеет значение.

Подробный пример с числами

Павел направляет фильтры по времени, товарам и каналам в один расчётный механизм

В таблице 1 000 заказов на 12 млн рублей. Из них 7,2 млн пришли из онлайна, 4,8 млн — из офлайна. Мера [Выручка] возвращает 12 млн. Создаём меру Онлайн = CALCULATE([Выручка], Канал[Тип] = "Онлайн") и получаем 7,2 млн. Доля онлайна = DIVIDE([Онлайн], [Выручка]) = 60%. Если пользователь выберет только апрель, обе меры пересчитаются для апреля. Если внутри CALCULATE убрать фильтр даты, числитель станет годовым, а знаменатель останется апрельским — процент получится технически правильным, но управленчески странным.

Проверять меру надо не по одной красивой карточке. Положите рядом исходную выручку, отфильтрованную выручку, дату, канал и товар. Если сумма по строкам не объясняет общий итог, откройте модель связей и посмотрите, какой фильтр реально доходит до таблицы фактов.

Как использовать в бизнесе

В бизнес-отчётах CALCULATE помогает закрепить единую методику: продажи без возвратов, выручка выбранного сегмента, факт на последнюю доступную дату, доля категории от общего итога. Сначала мы словами описываем правило, затем переносим его в меру. Если правило нельзя объяснить собственнику одним абзацем, формулу рано прятать в модель.

Когда применять этот подход

CALCULATE нужна, когда базовая мера остаётся прежней, а условия расчёта меняются: другой канал, фиксированный статус, очищенный фильтр или сравнение с общей базой. Если задача требует изменить сами строки источника, объединить таблицы или исправить справочник, лучше сделать это раньше — в источнике или Power Query. DAX не должен превращаться в склад исправлений данных.

Как проверить результат

Павел сверяет результаты в диагностической матрице с контрольным расчётом

Для контроля соберите матрицу: по строкам товары, по столбцам месяцы, в значениях базовая мера и версия с CALCULATE. Добавьте срез канала. Выберите один товар и месяц, выгрузите его операции и пересчитайте сумму вручную. Затем поменяйте только один фильтр. Если одновременно изменилось несколько условий, найти причину будет намного сложнее.

Как собрать расчёт по шагам

1. Начните с обычной меры

Создайте и отдельно проверьте базовое выражение, например сумму выручки. Не собирайте всю логику в одной строке.

2. Назовите изменяемый фильтр

Запишите словами, какой столбец должен быть добавлен, заменён или очищен.

3. Соберите CALCULATE

Добавляйте фильтры по одному и после каждого смотрите результат в простой таблице.

4. Проверьте пересечения

Сравните меру без фильтра, с одним фильтром и с несколькими. Так видно, где условие заменилось.

5. Зафиксируйте методику

Оставьте короткое описание меры рядом со словарём показателей и владельцем расчёта.

Ограничения и типичные ошибки

  • Писать CALCULATE вокруг каждой меры «на всякий случай».
  • Удалять фильтр даты и сравнивать годовой числитель с месячным знаменателем.
  • Использовать FILTER для простого условия по одному столбцу без необходимости.
  • Проверять только общий итог и не смотреть строки, где работает контекст.

После изменения модели проверьте контрольный набор вручную и запишите дату проверки. Если источник, связь или определение показателя изменились, старый результат уже нельзя молча сравнивать с новым.

Как я делаю это в проектах

В проектах я сначала делаю диагностическую страницу. На ней есть базовая мера, версия с CALCULATE и сами поля фильтра. Это не самая красивая страница отчёта, зато она быстро показывает, почему цифра изменилась. После проверки меру переносим в рабочий дашборд, а диагностическую страницу оставляем скрытой для поддержки. Когда маркетолог спрашивает, почему онлайн за апрель не совпал с CRM, мы открываем не спор, а условия расчёта.

Что сделать прямо сейчас

Возьмите одну меру с CALCULATE и письменно перечислите все фильтры, которые действуют до и после её вычисления.

Если хотите собрать расчёт вместе с моделью и нормальной проверкой данных, можно обсудить задачу с ФАНалитикой. Начнём с одного показателя и доведём его до решения, а не до ещё одной формулы в коллекции.

Первичные источники

ПО ТЕМЕ

Продолжить разбираться

Похожие материалы, которые развивают тему и помогают посмотреть на задачу с другой стороны.

Павел отдельно оценивает каждую коробку в ряду, а затем собирает результаты в общий итог
Управление5 мин435

SUMX в DAX: когда простой SUM уже не справляется

SUM складывает готовый столбец. SUMX проходит по строкам, считает выражение для каждой и только потом складывает результат. На этой разнице держится половина практики.

↗

Можно просто написать

Познакомимся и обсудим задачу

Расскажите, что хотите улучшить или в чём пока не можете разобраться. Необязательно приходить с готовым ТЗ — вместе посмотрим на ситуацию и поймём, с чего начать.

Работаем без заявки.

Не оставляйте номер и не ждите звонка. Просто напишите сами туда, где вам удобно.