Итак, я пытаюсь понять поведение функции FILTER(ALL) в DAX. Я создал два выражения DAX
1.
sales 100 using table in ALL =
CALCULATE(
[Customer sales],
FILTER(
ALL('Sales by Store'),
'Sales by Store'[quantity_sold] * 'Sales by Store'[unit_price] >100
)
)
sales 100 using column names in ALL =
CALCULATE(
[Customer sales],
FILTER(
ALL('Sales by Store'[quantity_sold], 'Sales by Store'[unit_price]),
'Sales by Store'[quantity_sold] * 'Sales by Store'[unit_price] >100
)
)
На изображении выше показано, почему при использовании имени таблицы в функции ALL мы получаем значения во всех категориях. Но когда мы используем имена столбцов, мы получаем их только там, где значение больше 100, что относится только к одной категории, кофейным зернам.
В первой формуле эффект использования всей таблицы заключается в удалении любого существующего фильтра в таблице. Поскольку внутренне DAX использует расширенную таблицу, это означает, что он также удаляет фильтры, установленные с использованием измерений, если они существуют.
Вместо этого во второй формуле используются только два столбца, поэтому другие существующие фильтры не удаляются, и, следовательно, мера [Customer Sales]
фильтруется новым контекстом фильтра, заданным выражением FILTER(ALL...)
, но в то же время также фильтруется ранее существовавшим отфильтровать product_category
.
Возможный способ заставить вторую формулу вести себя как первая — явно удалить другие фильтры с помощью REMOVEFILTERS
(или ALL
, если REMOVEFILTERS
еще не поддерживается)
sales 100 using column names in ALL =
CALCULATE(
[Customer sales],
FILTER(
ALL('Sales by Store'[quantity_sold], 'Sales by Store'[unit_price]),
'Sales by Store'[quantity_sold] * 'Sales by Store'[unit_price] >100
),
REMOVEFILTERS( 'Sales by Store' ) // or any dimension, if used
)
Чтобы первый вел себя как второй, можно использовать KEEPFILTERS
, который добавляет выражение FILTER
к фильтрам вместо замены ранее существовавших.
sales 100 using table in ALL =
CALCULATE(
[Customer sales],
KEEPFILTERS(
FILTER(
ALL('Sales by Store'),
'Sales by Store'[quantity_sold] * 'Sales by Store'[unit_price] >100
)
)
)
Я добавил формулу с KEEPFILTER, чтобы объяснить различия между двумя показателями. Применение KEEPFILTERS к FILTER в первой формуле изменяет поведение первой формулы. Таким образом, существующий фильтр не заменяется, а применяется вместе с новым. Результирующий фильтр является пересечением. Формула с KEEPFILTERS('Продажи по магазинам') неправильно использует KEEPFILTERS: KEEPFILTERS следует использовать вокруг фильтра, который может заменить существующий фильтр.
Спасибо, а зачем вы вложили ФИЛЬТР в функцию KEEPFILTER? Могу ли я определить меру, как определено ниже? продажи 100 с использованием таблицы в ALL KEEPFILTERS = CALCULATE([Продажи клиентов], KEEPFILTERS('Продажи по магазинам'), FILTER(ALL('Продажи по магазинам'), 'Продажи по магазинам'[quantity_sold] * 'Продажи по магазинам'[ unit_price] >100 ) )