← Все курсы · Курс Power BI · Все руководства
РАСЧЕТ и фильтрация контекста в DAX, объяснение в шестнадцати строках
К концу этой страницы вы сможете предсказать, что вернет CALCULATE, прежде чем писать его, объяснить, почему одна и та же мера дает 5060 в каждой строке одной таблицы и разное число в каждой строке другой, а также использовать KEEPFILTERS намеренно, а не копируя кого-то. Оно основано на одном правиле, изложенном в собственной документации Майкрософт, и все остальное на этой странице вытекает из него.
Вот чем на самом деле заняться сегодня. Возьмите любой написанный вами CALCULATE и задайте один вопрос о каждом из его аргументов фильтра: фильтрует ли уже визуальный элемент тот же столбец? Если да, ваш фильтр заменяет визуальный элемент. Если нет, к нему добавляется ваш фильтр. В этом вопросе и состоит весь механизм, и его ответ занимает пять секунд.
Краткая версия: мера выполняется внутри набора фильтров, и CALCULATE изменяет этот набор перед его запуском. Фильтр для столбца, уже находящегося в наборе, перезаписывает то, что там было. К нему присоединяется фильтр по любому другому столбцу.
Разница между заменой и добавлением составляет всю страницу, поэтому она получает представление.
- Что такое контекст фильтра, в одном предложении
- Правило: добавлено или перезаписано
- Один и тот же размер в двух визуальных элементах
- KEEPFILTERS, если вам нужно и то, и другое
- Удаление фильтров: процент от общего числа
- Переход контекста, другое задание CALCULATE
- Что не может содержать логический аргумент фильтра
- Полное до и после
- Крайние случаи, которые застают людей врасплох
- Почему это работает
- Использование этого на вашей собственной модели
- Все на одном экране
Заказы, таблица фактов. Шестнадцать рядов.
| ID заказа | Регион | Продукт | Единицы | Выручка |
|---|---|---|---|---|
| 1001 | Север | Рабочий стол | 4 | 880 |
| 1002 | Юг | Стул | 10 | 850 |
| 1003 | Восток | Рабочий стол | 3 | 660 |
| 1004 | Север | Лампа | 6 | 240 |
| 1005 | Юг | Рабочий стол | 3 | 660 |
| 1006 | Восток | Стул | 8 | 680 |
| 1007 | Север | Стул | 5 | 425 |
| 1008 | Запад | Лампа | 12 | 480 |
| 1009 | Юг | Лампа | 7 | 280 |
| 1010 | Восток | Рабочий стол | 5 | 1,100 |
| 1011 | Север | Рабочий стол | 2 | 440 |
| 1012 | Запад | Стул | 9 | 765 |
| 1013 | Восток | Лампа | 15 | 600 |
| 1014 | Север | Стул | 6 | 510 |
| 1015 | Юг | Рабочий стол | 4 | 880 |
| 1016 | Запад | Рабочий стол | 2 | 440 |
Товары, таблица измерений, присоединенная «один ко многим» к заказам на продукт.
| категория | Продукт | Список цен | Затраты |
|---|---|---|---|
| Мебель | Рабочий стол | 220 | 140 |
| Мебель | Стул | 85 | 52 |
| Освещение | Лампа | 40 | 22 |
Общий доход составляет 9890 по 101 единице. Из них письменных столов 5060, стульев 3230 и ламп 1600.
1. Что такое контекст фильтра, в одном предложении
Перед определением: ты ставишь меру Total Revenue = SUM(Orders[Revenue]) в таблицу, разделенную по продуктам. Рядом с «Столом» отображается 5060, а рядом со «Стулом» — 3230. Скажите, чем отличаются эти два числа, учитывая, что в показателе никогда не упоминается Продукт.
Визуал сделал это. Контекст фильтра — это набор фильтров, действующих при оценке меры, и он собирается из всего, что есть в отчете: строки, в которой находится мера, столбцов, срезов, фильтров страниц, перекрестного выделения из другого визуального элемента. Мера не знает и не заботится, откуда они взялись. Это просто противоречит всем выжившим строкам.
Таким образом, мера не имеет фиксированного ответа. SUM(Orders[Revenue]) составляет 9890 без каких-либо фильтров, 5060 в строке «Стол», 3040 в восточной строке и 1760 в ячейке, где пересекаются «Стол» и «Восток». Одна формула, один смысл и разное число в каждой ячейке, которая является всей точкой меры и покрыта с другой стороны в Столбцы против мер.
Полезная мысленная картина — это набор допустимых значений для каждого столбца. До какой-либо фильтрации каждый столбец допускает все. Таблица, разделенная по продуктам, помещает Продукт в этот набор ровно с одним допустимым значением в каждой строке. РАСЧЕТ — это функция, которая редактирует набор.
2. Правило: добавлено или перезаписано
Перед правилом: ты пишешь CALCULATE([Total Revenue], Products[Product] = "Desk") и поместите его в таблицу, нарезанную по продуктам. Прежде чем читать дальше, предскажите, что появится в строке «Стул».
5060, то же, что и строка «Стол», и это не ошибка. На справочной странице Майкрософт правило изложено в двух строках, и его стоит читать медленно:
В строке «Стул» «Продукт» уже находится в контексте фильтра, ограниченном «Стул». Ваш фильтр называет тот же столбец, поэтому он перезаписывает: «Продукт теперь доступен только для рабочего стола». Мера запускается и возвращает 5060 Рабочий стол, и это происходит в каждой строке таблицы, поскольку фильтр Продукт в каждой строке перезаписывается одним и тем же фильтром.
Скажите вслух, почему в итоговой строке также указано 5060, а не 9890. В итоговой строке нет собственного фильтра товаров, поэтому перезаписывать нечего. Вместо этого добавляется фильтр «Рабочий стол», и ответом является итоговое значение «Рабочий стол». То же правило, но на этот раз его «добавленная» ветвь.
Total Revenue = SUM ( Orders[Revenue] )
Desk Revenue =
CALCULATE ( [Total Revenue], Products[Product] = "Desk" )
| Продукт | Общий доход | Доход от отдела |
|---|---|---|
| Стул | 3,230 | 5,060 |
| Рабочий стол | 5,060 | 5,060 |
| Лампа | 1,600 | 5,060 |
| Общий | 9,890 | 5,060 |
3. Один и тот же размер в двух визуалах
Перед столом: возьмите то же самое Desk Revenue измерьте и поместите в таблицу, нарезанную Регион вместо. Предскажите, будет ли каждая строка снова отображать 5060.
Они этого не делают, и в этот момент правило перестает быть фактом и становится полезным.
| Регион | Общий доход | Доход от отдела |
|---|---|---|
| Восток | 3,040 | 1,760 |
| Север | 2,495 | 1,320 |
| Юг | 2,670 | 1,540 |
| Запад | 1,685 | 440 |
| Общий | 9,890 | 5,060 |
Здесь визуальные фильтры «Регион» и меры фильтров «Продукт». Разные столбцы, поэтому ничего не перезаписывается и применяются оба фильтра. 1760 Иста — это два кассовых заказа Иста, 660 плюс 1100. А четыре региональных показателя в сумме дают 5060, что является проверкой того, что оба фильтра действительно действуют.
Одна мера, написанная один раз, ведёт себя двояко. Ни одно из этих действий не является особым; оба выходят из одного и того же предложения в документации. Вот почему люди говорят: «CALCULATE перезаписывает фильтры» и «CALCULATE добавляет фильтры», и оба являются половиной правила.
Теперь представьте себе меру в вашей собственной модели, которая возвращает одно и то же число в каждой строке одних визуальных и осмысленных чисел в другой. Какой столбец он фильтрует, и по этому ли столбцу разбит разбитый визуальный элемент?
4. KEEPFILTERS, если вам нужно и то, и другое.
До исправления: в таблице продуктов вы на самом деле хотели, чтобы в строке «Стулья» отображался доход от столов и стульев, что представляет собой ничто, а не все столы. Скажите, что вам нужно РАССЧИТАТЬ, чтобы сделать по-другому.
Вам нужно, чтобы он пересекался, а не заменялся, и есть функция, вся работа которой заключается в этом. Майкрософт перечисляет KEEPFILTERS среди модификаторов фильтров с описанием «Добавить фильтр, не удаляя существующие фильтры в тех же столбцах».
Desk Revenue Kept =
CALCULATE ( [Total Revenue], KEEPFILTERS ( Products[Product] = "Desk" ) )
| Продукт | Доход от отдела | Доход отдела сохранен |
|---|---|---|
| Стул | 5,060 | (пустой) |
| Рабочий стол | 5,060 | 5,060 |
| Лампа | 5,060 | (пустой) |
| Общий | 5,060 | 5,060 |
В строке «Стул» теперь запрашиваются строки, являющиеся одновременно «Стул» и «Стол». Их нет, мере нечего суммировать, и DAX возвращает пустое значение, а не ноль. Пустые строки по умолчанию скрыты в большинстве визуальных элементов, что обычно и является тем, что вам нужно.
Какое из двух правильных, полностью зависит от вопроса. «Сколько приносят письменные столы, независимо от того, о чем идет речь?» — это первая мера, и это действительно то, что вам нужно в качестве знаменателя акции. «Какая часть этого ряда занимает парты?» это второй. Решить, какое предложение вы имели в виду, — это работа; функция - это просто переключатель.
5. Удаление фильтров: процент от общего числа
Перед техникой: вам нужна доля каждого региона в общем доходе. Числитель простой. Прежде чем читать дальше, скажите, что делает знаменатель трудным.
Знаменатель должен игнорировать строку, в которой он находится. В восточной строке контекст фильтра ограничивает регион востоком, и вам нужно вычислить число, как если бы оно не было. Для этого и нужен REMOVEFILTERS.
Revenue % of Total =
DIVIDE (
[Total Revenue],
CALCULATE ( [Total Revenue], REMOVEFILTERS ( Orders[Region] ) )
)
| Регион | Общий доход | Знаменатель | Доход % от общей суммы |
|---|---|---|---|
| Восток | 3,040 | 9,890 | 30.7% |
| Юг | 2,670 | 9,890 | 27.0% |
| Север | 2,495 | 9,890 | 25.2% |
| Запад | 1,685 | 9,890 | 17.0% |
| Общий | 9,890 | 9,890 | 100.0% |
Три заметки, которые сэкономят время позже. Использовать DIVIDE а не косую черту, потому что она возвращает пустое значение в нулевом знаменателе вместо ошибки. Удалите фильтры из конкретного столбца, по которому выполняется срез, а не из всей таблицы, иначе срез в другом столбце перестанет работать. И ALL в этой позиции выполняет ту же работу, что и REMOVEFILTERS; В собственном примечании Майкрософт говорится, что если ваш инструмент поддерживает REMOVEFILTERS, используйте его, поскольку ALL выполняет функцию возврата таблицы и ее легче неправильно прочитать.
Вариант, который стоит знать, ALLSELECTED, который удаляет фильтры, поступающие изнутри визуального элемента, но учитывает срезы и фильтры страниц. Проценты, построенные с помощью REMOVEFILTERS, всегда дают 100 процентов всего; проценты, созданные с помощью ALLSELECTED, добавляют к 100 процентам того, что пользователь выбрал в данный момент. Оба являются оправданными, и это разные отчеты.
6. Переход контекста, другое задание CALCULATE
Перед вторым заданием: CALCULATE без аргументов фильтра вообще выглядит бессмысленным. Прежде чем читать дальше, предскажите, для чего это может быть.
Он преобразует контекст строки в контекст фильтра. На странице Майкрософт ясно сказано: «Использование функции CALCULATE без фильтров позволяет достичь определенного требования. Оно преобразует контекст строки в контекст фильтра».
Контекст строки — это то, что у вас есть, когда вы находитесь в одной строке: внутри вычисляемого столбца или внутри итератора, такого как SUMX. Это позволяет вам читать значения этой строки. Это делает нет фильтровать что угодно, и этот факт удивляет людей, потому что кажется, что так и должно быть.
Вот демонстрация. Добавьте вычисляемый столбец в таблицу «Продукты» из трех строк.
-- calculated column on Products, no CALCULATE
Revenue Wrong = SUM ( Orders[Revenue] )
-- calculated column on Products, with CALCULATE
Revenue Right = CALCULATE ( SUM ( Orders[Revenue] ) )
| Продукт | Неправильный доход | Право на доход |
|---|---|---|
| Рабочий стол | 9,890 | 5,060 |
| Стул | 9,890 | 3,230 |
| Лампа | 9,890 | 1,600 |
Без команды РАСЧЕТ вы находитесь в строке «Стол» и видите слово «Стол», и ничего не фильтруется, поэтому сумма равна всей таблице: 9890 в каждой строке. При использовании CALCULATE строка, в которой вы находитесь, становится фильтром «Продукты», этот фильтр перемещается вниз по отношению к «Заказам», и вы получаете 5060.
То же самое происходит внутри SUMX, и есть один ярлык, который стоит запомнить: когда вы ссылаетесь на меру модели внутри контекста строки, переход происходит автоматически. Майкрософт заявляет об этом прямо: «Когда вы используете показатель модели в контексте строки, переход контекста происходит автоматически». Поэтому SUMX(Products, [Total Revenue]) дает 9890, а не 29670. Ссылка на меру выполняет невидимый ВЫЧИСЛЕНИЕ.
Скажите в одном предложении, почему это самый распространенный источник путаницы в DAX. Это связано с тем, что одна и та же функция выполняет две несвязанные на вид задачи, а вторая выполняется автоматически каждый раз, когда вы используете меру внутри итератора.
7. Чего не может содержать логический аргумент фильтра
До правил: Products[Product] = "Desk" является логическим фильтром. Угадай, что произойдет, если ты напишешь Orders[Revenue] > [Average Order] вместо этого, где правая часть является мерой.
Это ошибки. На странице Майкрософт перечислены ограничения на логическое выражение фильтра, и они строгие:
- Он может ссылаться на столбцы из одной таблицы.
- Он не может ссылаться на меры.
- Он не может использовать вложенную функцию CALCULATE.
- Он не может использовать функции, которые сканируют или возвращают таблицу, если вы не передаете их в качестве аргументов функциям агрегирования.
Каждый из них фиксируется одинаково: используйте FILTER, который принимает таблицу и условие и возвращает оставшиеся строки и не имеет ни одного из этих ограничений.
Above Average Revenue =
VAR AvgOrder = AVERAGE ( Orders[Revenue] ) -- 618.125
RETURN
CALCULATE (
[Total Revenue],
FILTER ( Orders, Orders[Revenue] > AvgOrder )
)
-- 6,475, across the 8 orders above the average
Из этого стоит извлечь две вещи. VAR вычисляет среднее значение один раз во внешнем контексте фильтра, прежде чем FILTER начнет итерацию, что почти всегда именно то, что вы имели в виду. А FILTER — это табличный фильтр, а не логический, поэтому он заменяет фильтры всей таблицы в столбцах, которых он касается, поэтому FILTER(Orders, ...) обработка большой таблицы фактов медленнее, чем логический фильтр, и ее следует нацеливать на наименьшую подходящую таблицу.
Эмпирическое правило: сначала используйте логический фильтр, потому что он быстрее и понятнее, и переключайтесь на FILTER только тогда, когда условие требует измерения, двух таблиц или сравнения с чем-то вычисленным.
Полное до и после
Оба раза одно и то же требование: таблица по регионам, показывающая доход, доход от отдела и долю каждого региона.
До
Desk Share =
DIVIDE (
CALCULATE ( SUM ( Orders[Revenue] ), Orders[Product] = "Desk" ),
SUM ( Orders[Revenue] )
)
Он работает в таблице регионов и прерывается в тот момент, когда кто-то добавляет «Продукт» к визуальному элементу, потому что тогда фильтр «Продукт» числителя перезаписывает строку, и в каждой строке продукта отображаются столы, а не ее общая сумма. Есть еще скрытая зависимость: он фильтрует Orders[Product], поэтому он автоматически перестает соответствовать измерению «Продукты», если модель когда-либо будет приведена в порядок.
после
Total Revenue = SUM ( Orders[Revenue] )
Desk Revenue =
CALCULATE ( [Total Revenue], KEEPFILTERS ( Products[Product] = "Desk" ) )
Revenue % of Total =
DIVIDE (
[Total Revenue],
CALCULATE ( [Total Revenue], REMOVEFILTERS ( Orders[Region] ) )
)
Три меры вместо одного выражения. Базовый показатель определяется один раз и используется повторно, поэтому изменение способа суммирования доходов происходит в одном месте. KEEPFILTERS делает настольные измерения честными при любом визуальном изображении, включая нарезку по продуктам. А мера общего доступа называет именно тот столбец, который она игнорирует, поэтому срез для всего остального продолжает работать. Те же числа в исходном визуальном элементе, и ни одно из них не меняется при изменении визуального элемента.
Крайние случаи, которые застают людей врасплох
Шесть, каждая из которых стоила кому-то дня.
Два фильтра в одном столбце в одном РАСЧЕТ. Они комбинируются с помощью AND, поэтому Products[Product] = "Desk", Products[Product] = "Chair" возвращает пустое значение, а не оба. Для «или-или» напишите один аргумент с ||или используйте IN { "Desk", "Chair" }.
Фильтрация таблицы фактов, когда вы имели в виду измерение. Orders[Product] = "Desk" и Products[Product] = "Desk" дайте тот же ответ здесь и ведите себя по-другому, когда продукт существует в измерении без заказов. Фильтровать измерение по умолчанию; для этого и нужны размеры, т.к. руководство по звездообразной схеме крышки.
Ожидается, что пробел и ноль будут вести себя одинаково. Мера без строк возвращает пустое значение, пустые строки скрыты большинством визуальных элементов, а 0 + BLANK() равен 0, пока BLANK() + BLANK() пусто. Если вам нужен видимый ноль, оберните его: [Measure] + 0.
ВСЕ на таблице, когда вы имели в виду один столбец. ALL(Orders) удаляет все фильтры в каждом столбце таблицы фактов, поэтому срез, установленный пользователем, игнорируется. Назовите столбец.
Мера, которая работает до тех пор, пока кто-нибудь не добавит срез. Если в показателе жестко запрограммирован фильтр для столбца, срез в этом столбце перестанет выполнять какие-либо действия, и ошибка не появится. Это основная причина того, что «отчет неправильный, но только для некоторых пользователей».
ФИЛЬТРАЦИЯ по таблице фактов на большой модели. Правильно и медленно. Он повторяет каждую строку. Отфильтруйте измерение или используйте логический фильтр, если только условие действительно не требует строк фактов.
Почему это работает
Контекст фильтра — это заданная семантика, и его прочтение таким образом делает правило замены против добавления очевидным, а не произвольным. Контекст фильтра — это набор разрешенных значений для каждого столбца, а запрос возвращает строки, значения которых входят в каждый из этих наборов. CALCULATE заменяет набор для любого столбца, который он называет, и оставляет остальные в покое, поэтому второй фильтр для продукта не может сосуществовать с первым, а фильтр для продукта рядом с фильтром для региона просто пересекается. Это реляционная алгебра выбора продукта атрибутных доменов, которая является основой, которую наследуют оба SQL и DAX (Кодд, 1970, Коммуникации ACM, 13(6), 377–387). KEEPFILTERS отказывается от замены и вместо этого запрашивает пересечение, поэтому он может дать пустой набор и пустой результат.
Конкретные варианты поведения на этой странице отражают поведение продукта, а не результаты исследований, поэтому авторитетом для них является собственная справочная документация поставщика, а не журнал. Каждое процитированное выше правило взято из справочника Microsoft DAX для CALCULATE, в котором указаны правило добавления или перезаписи, поведение при смене контекста, автоматический переход для показателей модели и ограничения на логические выражения фильтра. Эти страницы перечислены в списке ссылок, и их стоит прочитать напрямую; они кратки, точны и более надежны, чем любое их изложение, включая это.
Одно замечание о том, почему эта страница продолжает просить вас предсказать, прежде чем показать вам ответ. Попытка дать ответ до того, как вы увидите правильный, достоверно повышает, насколько хорошо сохраняется правильный ответ, даже если попытка неверна (Бисра, Лю, Несбит, Салими и Винн, 2018, Обзор педагогической психологии, 30(3), 703–725). Число 5060 в строке «Стул» остается неизменным, потому что вас попросили угадать его первым, а большинство людей угадывают пусто.
Использование этого на вашей собственной модели
Проверять каждую меру в унаследованной модели — занятие утомительное, и вы остановитесь на шестом. Вместо этого сделайте это по порядку.
- Определите одну базовую меру для каждого числа и построить из него все остальное.
[Total Revenue]один раз, а затем укажите его. Ничто другое не обеспечивает удобство обслуживания модели. - Для каждого ВЫЧИСЛЕНИЯ укажите столбец, который он фильтрует. и проверьте, есть ли какие-либо визуальные фрагменты по этому столбцу. Эта одна проверка выявляет большинство сломанных мер.
- Добавить КИПФИЛЬТРЫ где бы вы ни имели в виду «из этой строки», а не «независимо от этой строки».
- Используйте REMOVEFILTERS для именованных столбцов., никогда для целых таблиц и для любого процента от общего числа.
- Проверьте каждую меру в двух визуальных элементах, один нарезан по столбцу, который он фильтрует, а другой нет. Если он ведет себя одинаково в обоих случаях, вы его не проверяли.
Если у вас под рукой есть бумага, один дополнительный рисунок стоит пяти минут. Нарисуйте поле для контекста фильтра с чипом для каждого фильтруемого столбца, затем нарисуйте прибытие собственного фильтра CALCULATE. Вручную решить, приземлится ли он на занятую фишку или на пустое место, — это целый навык, а если сделать это ручкой один раз, это станет автоматическим.
Все на одном экране
Это лист поиска. Закройте правую колонку, проработайте левую и произнесите каждый ответ вслух, прежде чем проверять его.
| Идея | Что это значит |
|---|---|
| Контекст фильтра | Набор фильтров, внутри которых выполняется мера. Строки, столбцы, срезы, фильтры страниц, перекрестное выделение. |
| Правило | Фильтровать по уже отфильтрованному столбцу: перезаписано. Фильтр по любому другому столбцу: добавлен. |
| Та же мера, таблица продуктов | 5060 в каждой строке, поскольку Продукт каждый раз перезаписывается. |
| Та же мера, таблица регионов | 1760/1320/1540/440, потому что Регион выживает, а Продукт присоединяется. |
| Чек | Эти четыре в сумме дают 5060. Если они этого не сделали, один из фильтров был утерян. |
| KEEPFILTERS | Пересечение вместо замены. Строка стульев становится пустой, а не 5060. |
| Пустой против нуля | Ни одна строка не дает пустого места. Пустые строки скрыты большинством визуальных элементов. Добавьте 0, чтобы получить ноль. |
| REMOVEFILTERS | Удаление фильтров из именованного столбца. Знаменатель любого процента от суммы. |
| ВСЕ против УДАЛИТЬ ФИЛЬТРЫ | Здесь та же работа. Предпочитайте REMOVEFILTERS; ALL также является табличной функцией и читается неоднозначно. |
| ALLSELECTED | Не обращайте внимания на собственные фильтры визуального элемента, но уважайте срезы. Другой действительный процент. |
| Переход контекста | CALCULATE без фильтров превращает текущую строку в фильтр. 9890 становится 5060. |
| Автоматический переход | Ссылка на меру модели внутри строки незаметно меняет контекст. |
| Логические пределы фильтра | Одна таблица, без мер, без вложенных вычислений CALCULATE, без табличных функций вне агрегатов. |
| FILTER | Аварийный люк для всего этого. Помедленнее. Направьте его на самый маленький стол, который подойдет. |
| Два фильтра, одна колонка | В сочетании с AND, поэтому они отменяются. Использовать || или IN. |
| Тест | Попробуйте каждую меру в двух визуальных элементах: один разделен по столбцу, который он фильтрует, а другой нет. |
Еще одна мысль, и мне бы искренне хотелось услышать ответы других людей. Первый CALCULATE, который я отправил, вернул одно и то же число в каждой строке таблицы, и я провел день, убежденный, что данные неверны. Какая мера в вашей модели ведет себя по-разному в двух визуальных элементах, и определили ли вы, какой столбец она фильтрует?
Ссылки
- Кодд, EF (1970). Реляционная модель данных для крупных общих банков данных. Коммуникации ACM, 13(6), 377–387.
- Бисра К., Лю К., Несбит Дж. К., Салими Ф. и Винн П. Х. (2018). Побуждение к самообъяснению: метаанализ. Обзор педагогической психологии, 30(3), 703–725.
- Майкрософт. Функция РАСЧЕТ (DAX), ссылка на DAX. Источник каждого цитируемого правила на этой странице: добавление или перезапись, переход контекста, автоматический переход для показателей модели и ограничения на логические выражения фильтра. Документация продукта, а не рецензируемые исследования, которые являются правильным источником информации о поведении продукта.
- Майкрософт. Функция КИПФИЛЬТРЫ (DAX) и Функция УДАЛЕНИЕ ФИЛЬТРОВ (DAX), ссылка на DAX.
Power BI для аналитиков занимает 187 страниц, контекст фильтра разбирается по одному модификатору за раз, поэтому CALCULATE перестает быть предположением.
Power BI для аналитиков, 19 долларов США →тот Курс Power BI дает вам повторения: меры для прогнозирования перед запуском, карточки с правилом добавления или перезаписи и вопросы, которые задают вам, какой визуальный элемент нарушит данный РАСЧЕТ. Теперь вы владеете методом; комплект - это практика. Ничего устанавливать, учетная запись не требуется.
Откройте комплект Power BI →