#excel #excel-formula #powerbi #dax #powerpivot
#excel #excel-формула #powerbi #dax #powerpivot
Вопрос:
Мне интересно, в чем разница между этими двумя выражениями DAX, каждое из которых возвращает то, что мне нужно:
(1) =calculate([PctMkt], FILTER ( ALL ( BondDim), BondDim[Quality] = "HY" ))
(2) =calculate([PctMkt], ALL(BondDim), BondDim[Quality] = "HY" )
Делает ли механизм DAX эти два выражения эквивалентными? Является ли (2) просто коротким для (1)? Кроме того, будет ли (1) вычисляться быстрее? Пытаюсь убедиться, что я не вызываю проблем в сводной таблице, «взламывая» вместе вычисленные меры. Эти меры позволяют пользователю выполнять детализацию до более низкого уровня, сохраняя данные более высокого уровня в контексте сводной таблицы.
Ответ №1:
Более простой, похожий вопрос хорошо известен.
CALCULATE (
[PctMkt],
BondDim[Quality] = "HY"
)
является сокращенным эквивалентом
CALCULATE (
[PctMkt],
FILTER (
ALL ( BondDim[Quality] ),
BondDim[Quality] = "HY"
)
)
Ваши формулы требуют немного больше размышлений.
Когда ALL используется в качестве аргумента CALCULATE , он удаляет только фильтры (например, REMOVEFILTERS ), а не действует как табличное выражение.
Когда ALL ( < table > )
используется в качестве аргумента FILTER , это обязательно табличное выражение.
Первая ссылка, которую я дал, дает подробный пример того, как это различие может иметь важное значение. Я приведу здесь другой пример:
Предположим MarketDim
, имеет отношение «один ко многим BondDim
» (и не является двунаправленным) для ID
столбца из каждого, и таблицы выглядят следующим образом:
BondDim MarketDim
Quality ID ID Pct
------------- ----------
HY 1 1 5%
VY 1 2 10%
XY 2 3 20%
Предположим, [PctMkt] := MAX ( MarketDim[Pct] )
Затем в вашей первой формуле (1)
аргументом фильтра является следующая таблица:
Quality ID
-------------
HY 1
Таким образом, результат (1)
может быть только 5%
(или пустым), поскольку ID = 1
это единственный вариант.
В вашей второй формуле (2)
нет аргументов таблицы, поскольку ALL ( BondDim )
она удаляет только фильтры и BondDim[Quality] = "HY"
работает только с одним столбцом. Без аргументов таблицы, поскольку MarketDim
filters BondDim
, но не наоборот (поскольку это отношение с одним направлением), ни один из этих аргументов фильтра столбцов не влияет на определенную мной меру (хотя это может повлиять на вашу фактическую меру).
Таким образом, результат (2)
будет таким же, как и просто CALCULATE ( [PctMkt] )
, что будет 20%
, если не будет включена фильтрация MarketDim
для исключения ID = 3
.
Примечание: Это упрощение для (2)
не выполняется, если [PctMkt]
работает со BondDim
столбцами или любыми столбцами таблицы, которые фильтруются BondDim
в вашей модели. Т.Е. Фильтры распространяются «вниз по течению» по отношениям, но не «вверх по течению».
Ответ №2:
Второй
CALCULATE (
[PctMkt],
ALL ( BondDim ),
BondDim[Quality] = "HY"
)
внутренне расширяется на DAX как эквивалентная формула
CALCULATE (
[PctMkt],
ALL ( BondDim ),
FILTER (
ALL ( BondDim[Quality] ),
BondDim[Quality] = "HY"
)
)
Так что это не то же самое, что и первый
CALCULATE (
[PctMkt],
FILTER (
ALL ( BondDim ),
BondDim[Quality] = "HY"
)
)
Разница в том, что первый использует всю таблицу BondDim в качестве фильтра, в то время как второй использует только один столбец той же таблицы