← Все курсы · Курс Power BI · Все руководства

РАСЧЕТ и фильтрация контекста в DAX, объяснение в шестнадцати строках

Одно правило решает все, что делает CALCULATE · Часть Analyst Prep Kit

К , аналитик данных · Опубликовано

К концу этой страницы вы сможете предсказать, что вернет CALCULATE, прежде чем писать его, объяснить, почему одна и та же мера дает 5060 в каждой строке одной таблицы и разное число в каждой строке другой, а также использовать KEEPFILTERS намеренно, а не копируя кого-то. Оно основано на одном правиле, изложенном в собственной документации Майкрософт, и все остальное на этой странице вытекает из него.

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

Краткая версия: мера выполняется внутри набора фильтров, и CALCULATE изменяет этот набор перед его запуском. Фильтр для столбца, уже находящегося в наборе, перезаписывает то, что там было. К нему присоединяется фильтр по любому другому столбцу.

Разница между заменой и добавлением составляет всю страницу, поэтому она получает представление.

Replaced on the same column, added on a different one Two rows of the same three-part arrangement, one above the other. In each row, a rounded box on the left holds a small rounded chip, an arrow runs from that box to a rounded box on the right, and a second chip drops into the arrow from above, so it is arriving as the arrow is followed. In the upper row the left box holds a chip reading Chair, and the arriving chip reads Desk. In the right-hand box of that row there is only one chip, reading Desk, and the Chair chip is shown again faintly behind it with a diagonal line struck through it, so it reads as having been replaced. A small label at the far left of the row reads Product. In the lower row the left box holds a chip reading East and the arriving chip again reads Desk. In the right-hand box of that row there are two chips stacked one above the other, East and Desk, both drawn solid, so it reads as having gained a chip rather than swapped one. A small label at the far left of that row reads Region. Product Chair Desk Chair Desk Region East Desk East Desk
Один и тот же фильтр CALCULATE попадает в два разных визуальных элемента. Верхняя строка представляет собой таблицу, разбитую по продуктам, поэтому входящий фильтр Рабочий стол попадает в уже отфильтрованный столбец и заменяет его. Нижняя строка представляет собой таблицу, разделенную по регионам, поэтому фильтр «Стол» попадает в нетронутый столбец и объединяет все, что там есть. Одна мера, два поведения, полностью определяемые тем, что уже фильтрует визуальный элемент.
Что вы узнаете
  1. Что такое контекст фильтра, в одном предложении
  2. Правило: добавлено или перезаписано
  3. Один и тот же размер в двух визуальных элементах
  4. KEEPFILTERS, если вам нужно и то, и другое
  5. Удаление фильтров: процент от общего числа
  6. Переход контекста, другое задание CALCULATE
  7. Что не может содержать логический аргумент фильтра
  8. Полное до и после
  9. Крайние случаи, которые застают людей врасплох
  10. Почему это работает
  11. Использование этого на вашей собственной модели
  12. Все на одном экране
Каждое число на этой странице является реальным. Шестнадцать заказов и трехрядная таблица товаров — то же самое приспособление, которое используется в этих направляющих. Каждое описанное здесь поведение DAX указано в собственной справочной документации Майкрософт, указанной в разделе «почему это работает», а не предполагается. Если меры по вычисляемым столбцам все еще нечеткие, Столбцы против мер на первом месте.

Заказы, таблица фактов. Шестнадцать рядов.

ID заказаРегионПродуктЕдиницыВыручка
1001СеверРабочий стол4880
1002ЮгСтул10850
1003ВостокРабочий стол3660
1004СеверЛампа6240
1005ЮгРабочий стол3660
1006ВостокСтул8680
1007СеверСтул5425
1008ЗападЛампа12480
1009ЮгЛампа7280
1010ВостокРабочий стол51,100
1011СеверРабочий стол2440
1012ЗападСтул9765
1013ВостокЛампа15600
1014СеверСтул6510
1015ЮгРабочий стол4880
1016ЗападРабочий стол2440

Товары, таблица измерений, присоединенная «один ко многим» к заказам на продукт.

категорияПродуктСписок ценЗатраты
МебельРабочий стол220140
МебельСтул8552
ОсвещениеЛампа4022

Общий доход составляет 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,2305,060
Рабочий стол5,0605,060
Лампа1,6005,060
Общий9,8905,060

3. Один и тот же размер в двух визуалах

Перед столом: возьмите то же самое Desk Revenue измерьте и поместите в таблицу, нарезанную Регион вместо. Предскажите, будет ли каждая строка снова отображать 5060.

Они этого не делают, и в этот момент правило перестает быть фактом и становится полезным.

РегионОбщий доходДоход от отдела
Восток3,0401,760
Север2,4951,320
Юг2,6701,540
Запад1,685440
Общий9,8905,060

Здесь визуальные фильтры «Регион» и меры фильтров «Продукт». Разные столбцы, поэтому ничего не перезаписывается и применяются оба фильтра. 1760 Иста — это два кассовых заказа Иста, 660 плюс 1100. А четыре региональных показателя в сумме дают 5060, что является проверкой того, что оба фильтра действительно действуют.

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

Теперь представьте себе меру в вашей собственной модели, которая возвращает одно и то же число в каждой строке одних визуальных и осмысленных чисел в другой. Какой столбец он фильтрует, и по этому ли столбцу разбит разбитый визуальный элемент?

4. KEEPFILTERS, если вам нужно и то, и другое.

До исправления: в таблице продуктов вы на самом деле хотели, чтобы в строке «Стулья» отображался доход от столов и стульев, что представляет собой ничто, а не все столы. Скажите, что вам нужно РАССЧИТАТЬ, чтобы сделать по-другому.

Вам нужно, чтобы он пересекался, а не заменялся, и есть функция, вся работа которой заключается в этом. Майкрософт перечисляет KEEPFILTERS среди модификаторов фильтров с описанием «Добавить фильтр, не удаляя существующие фильтры в тех же столбцах».

Desk Revenue Kept =
CALCULATE ( [Total Revenue], KEEPFILTERS ( Products[Product] = "Desk" ) )
ПродуктДоход от отделаДоход отдела сохранен
Стул5,060(пустой)
Рабочий стол5,0605,060
Лампа5,060(пустой)
Общий5,0605,060

В строке «Стул» теперь запрашиваются строки, являющиеся одновременно «Стул» и «Стол». Их нет, мере нечего суммировать, и DAX возвращает пустое значение, а не ноль. Пустые строки по умолчанию скрыты в большинстве визуальных элементов, что обычно и является тем, что вам нужно.

Какое из двух правильных, полностью зависит от вопроса. «Сколько приносят письменные столы, независимо от того, о чем идет речь?» — это первая мера, и это действительно то, что вам нужно в качестве знаменателя акции. «Какая часть этого ряда занимает парты?» это второй. Решить, какое предложение вы имели в виду, — это работа; функция - это просто переключатель.

5. Удаление фильтров: процент от общего числа

Перед техникой: вам нужна доля каждого региона в общем доходе. Числитель простой. Прежде чем читать дальше, скажите, что делает знаменатель трудным.

Знаменатель должен игнорировать строку, в которой он находится. В восточной строке контекст фильтра ограничивает регион востоком, и вам нужно вычислить число, как если бы оно не было. Для этого и нужен REMOVEFILTERS.

Revenue % of Total =
DIVIDE (
    [Total Revenue],
    CALCULATE ( [Total Revenue], REMOVEFILTERS ( Orders[Region] ) )
)
РегионОбщий доходЗнаменательДоход % от общей суммы
Восток3,0409,89030.7%
Юг2,6709,89027.0%
Север2,4959,89025.2%
Запад1,6859,89017.0%
Общий9,8909,890100.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,8905,060
Стул9,8903,230
Лампа9,8901,600

Без команды РАСЧЕТ вы находитесь в строке «Стол» и видите слово «Стол», и ничего не фильтруется, поэтому сумма равна всей таблице: 9890 в каждой строке. При использовании CALCULATE строка, в которой вы находитесь, становится фильтром «Продукты», этот фильтр перемещается вниз по отношению к «Заказам», и вы получаете 5060.

То же самое происходит внутри SUMX, и есть один ярлык, который стоит запомнить: когда вы ссылаетесь на меру модели внутри контекста строки, переход происходит автоматически. Майкрософт заявляет об этом прямо: «Когда вы используете показатель модели в контексте строки, переход контекста происходит автоматически». Поэтому SUMX(Products, [Total Revenue]) дает 9890, а не 29670. Ссылка на меру выполняет невидимый ВЫЧИСЛЕНИЕ.

Скажите в одном предложении, почему это самый распространенный источник путаницы в DAX. Это связано с тем, что одна и та же функция выполняет две несвязанные на вид задачи, а вторая выполняется автоматически каждый раз, когда вы используете меру внутри итератора.

7. Чего не может содержать логический аргумент фильтра

До правил: Products[Product] = "Desk" является логическим фильтром. Угадай, что произойдет, если ты напишешь Orders[Revenue] > [Average Order] вместо этого, где правая часть является мерой.

Это ошибки. На странице Майкрософт перечислены ограничения на логическое выражение фильтра, и они строгие:

Каждый из них фиксируется одинаково: используйте 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 в строке «Стул» остается неизменным, потому что вас попросили угадать его первым, а большинство людей угадывают пусто.

Использование этого на вашей собственной модели

Проверять каждую меру в унаследованной модели — занятие утомительное, и вы остановитесь на шестом. Вместо этого сделайте это по порядку.

  1. Определите одну базовую меру для каждого числа и построить из него все остальное. [Total Revenue] один раз, а затем укажите его. Ничто другое не обеспечивает удобство обслуживания модели.
  2. Для каждого ВЫЧИСЛЕНИЯ укажите столбец, который он фильтрует. и проверьте, есть ли какие-либо визуальные фрагменты по этому столбцу. Эта одна проверка выявляет большинство сломанных мер.
  3. Добавить КИПФИЛЬТРЫ где бы вы ни имели в виду «из этой строки», а не «независимо от этой строки».
  4. Используйте REMOVEFILTERS для именованных столбцов., никогда для целых таблиц и для любого процента от общего числа.
  5. Проверьте каждую меру в двух визуальных элементах, один нарезан по столбцу, который он фильтрует, а другой нет. Если он ведет себя одинаково в обоих случаях, вы его не проверяли.

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

Подробнее об этом и еще что-нибудь подобное. Все инструкции находятся в одном месте на индекс направляющих: SQL, Python, Excel, Power BI и связанные с ними рабочие привычки.

Все на одном экране

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

ИдеяЧто это значит
Контекст фильтраНабор фильтров, внутри которых выполняется мера. Строки, столбцы, срезы, фильтры страниц, перекрестное выделение.
ПравилоФильтровать по уже отфильтрованному столбцу: перезаписано. Фильтр по любому другому столбцу: добавлен.
Та же мера, таблица продуктов5060 в каждой строке, поскольку Продукт каждый раз перезаписывается.
Та же мера, таблица регионов1760/1320/1540/440, потому что Регион выживает, а Продукт присоединяется.
ЧекЭти четыре в сумме дают 5060. Если они этого не сделали, один из фильтров был утерян.
KEEPFILTERSПересечение вместо замены. Строка стульев становится пустой, а не 5060.
Пустой против нуляНи одна строка не дает пустого места. Пустые строки скрыты большинством визуальных элементов. Добавьте 0, чтобы получить ноль.
REMOVEFILTERSУдаление фильтров из именованного столбца. Знаменатель любого процента от суммы.
ВСЕ против УДАЛИТЬ ФИЛЬТРЫЗдесь та же работа. Предпочитайте REMOVEFILTERS; ALL также является табличной функцией и читается неоднозначно.
ALLSELECTEDНе обращайте внимания на собственные фильтры визуального элемента, но уважайте срезы. Другой действительный процент.
Переход контекстаCALCULATE без фильтров превращает текущую строку в фильтр. 9890 становится 5060.
Автоматический переходСсылка на меру модели внутри строки незаметно меняет контекст.
Логические пределы фильтраОдна таблица, без мер, без вложенных вычислений CALCULATE, без табличных функций вне агрегатов.
FILTERАварийный люк для всего этого. Помедленнее. Направьте его на самый маленький стол, который подойдет.
Два фильтра, одна колонкаВ сочетании с AND, поэтому они отменяются. Использовать || или IN.
ТестПопробуйте каждую меру в двух визуальных элементах: один разделен по столбцу, который он фильтрует, а другой нет.
Единственная привычка, которую следует сохранить. Для каждого написанного вами значения CALCULATE проговаривайте вслух, какой столбец он фильтрует и фильтрует ли уже визуальный элемент этот столбец. Добавлен или перезаписан — единственный вопрос, и ответить на него до запуска отчета быстрее, чем потом его отлаживать. Если какая-либо мера нарушается таким образом, который не описан на этой странице, существует общая шлейф диагностики на предмет застревания.

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

Ссылки

CALCULATE возвращает число, и вы не можете сказать, какие фильтры были задействованы в тот момент.

Power BI для аналитиков занимает 187 страниц, контекст фильтра разбирается по одному модификатору за раз, поэтому CALCULATE перестает быть предположением.

Power BI для аналитиков, 19 долларов США →
Потренируйтесь в этом на модели перед собой.

тот Курс Power BI дает вам повторения: меры для прогнозирования перед запуском, карточки с правилом добавления или перезаписи и вопросы, которые задают вам, какой визуальный элемент нарушит данный РАСЧЕТ. Теперь вы владеете методом; комплект - это практика. Ничего устанавливать, учетная запись не требуется.

Откройте комплект Power BI →