CALCULATE меняет контекст — а чем именно его менять, задают фильтрующие функции. Это рабочая лошадь долей, нарастающих итогов и сложных условий. Разберём четыре главные.
FILTER — сложное условие
Когда условие хитрее, чем «столбец = значение», его задаёт FILTER. Он возвращает таблицу, оставив строки, которые проходят проверку:
Выручка крупных продаж =
CALCULATE (
[Выручка],
FILTER ( Продажи, Продажи[Количество] >= 10 )
)
FILTER отобрал строки с количеством от 10, и CALCULATE посчитал выручку только по ним. Так задают любые условия со сравнением, диапазоном, несколькими столбцами.
FILTER проходит таблицу построчно, поэтому на больших фактах он дороже простого фильтра-условия. Если хватает CALCULATE([Выручка], Товары[Категория]="Молочка") — берите его; FILTER — когда условие сложное.
ALL и REMOVEFILTERS — убрать фильтры
ALL снимает фильтры с таблицы или столбца. Главное применение — знаменатель доли: убрать текущий разрез, чтобы получить «итого».
Доля региона =
DIVIDE ( [Выручка], CALCULATE ( [Выручка], ALL ( Регионы ) ) )
В числителе — выручка текущего региона (из контекста строки). В знаменателе ALL(Регионы) убирает фильтр региона — получается выручка по всем регионам. Делим — доля. В строке ЦФО выйдет около 26%.
REMOVEFILTERS делает то же самое и читается понятнее — это современный синоним ALL в роли «убрать фильтры».
ALLSELECTED — уважать выбор пользователя
Тонкий, но очень полезный. ALL убирает все фильтры. Но часто нужно убрать только фильтр визуала (строку таблицы), а срез пользователя сохранить. Это ALLSELECTED:
Доля в выборке =
DIVIDE ( [Выручка], CALCULATE ( [Выручка], ALLSELECTED ( Регионы ) ) )
Если пользователь срезом оставил 4 округа, доли посчитаются в пределах этих четырёх и дадут в сумме 100%. С ALL знаменатель был бы по всем восьми, и доли «не сошлись» бы к 100% от видимого. Для процентов «внутри выбранного» берут ALLSELECTED.
Нужен итог по всем данным независимо от среза → ALL / REMOVEFILTERS. Нужен итог по тому, что выбрал пользователь → ALLSELECTED. Перепутать легко — а доли разойдутся.
KEEPFILTERS — пересечь, а не заменить
По умолчанию фильтр в CALCULATE заменяет существующий по этому столбцу. KEEPFILTERS заставляет его пересекаться с текущим:
Выручка дорогих в выбранной категории =
CALCULATE ( [Выручка], KEEPFILTERS ( Товары[Цена] >= 500 ) )
Без KEEPFILTERS условие «цена ≥ 500» работало бы поверх выбранной категории, переопределяя её фильтр по цене; с ним — дополняет текущий контекст, не стирая его. Нужен реже остальных, но знать стоит.
Шпаргалка
| Функция | Зачем |
|---|---|
FILTER | сложное построчное условие внутри CALCULATE |
ALL / REMOVEFILTERS | убрать фильтры (знаменатель «итого») |
ALLSELECTED | убрать фильтр визуала, сохранить срез пользователя |
KEEPFILTERS | пересечь фильтр с текущим, а не заменить |
Что дальше
Мы собрали ядро: агрегации, итераторы, CALCULATE и фильтры. Дальше — функции на каждый день: условия (IF, SWITCH), безопасное деление (DIVIDE), связи между таблицами (RELATED), работа со временем (YTD, прошлый год) и VAR/RETURN для читаемости. Это следующие уроки.