W DAX Istnieją dwie specjalne funkcje pozwalające sprawdzić mechanizm propagowania kontekstu filtra chodzi mianowicie o ISFILTERED oraz ISCROSSFILTERED, które chciałbym opisać w niniejszym artykule.
Wspomniane funkcje działają następująco:
- ISFILTERED – zwraca TRUE lub FALSE w zależności czy kolumna przekazana jako argument jest bezpośrednio filtrowana
- ISCROSSFILTERED – zwraca TRUE lub FALSE w zależności od tego czy kolumna przekazana jako argument jest filtrowana z powodu automatycznej propagacji filtra
Sprawdźmy ich działanie co pozwoli lepiej zrozumieć propagację filtra. Poniżej przedstawione zostały dwie miary sprawdzające kontekst wykonania oraz wynik ich działania w tabeli przestawnej. W wierszach tejże tabeli umieszczona została kolumna Size, a w fragmentatorze natomiast kolumna Color.
IsColorFiltered := ISFILTERED ( 'DimProduct'[Color] ) IsSizeFiltered := ISFILTERED ( 'DimProduct'[Size] )
Jak można zauważyć kolumna Color nie jest w żaden sposób filtrowana ani na poziomie wierszy, ani na poziomie Grand Total tabeli przestawnej. Nie zmienia tego fakt, iż w fragmentatorze znajdują się wartości właśnie tej kolumny – dzieje się tak ze względu na to, że nie została wybrana żadna konkretna wartość tylko wszystkie – co jest równe z brakiem filtracji.
Inaczej ma się sprawa z kolumną Size, która na poziomie wierszy jest filtrowana przez konkretną wartość tegoż wiersza. Na poziomie Grand Total stworzona miara zwraca FALSE ponieważ tak naprawdę żaden filtr tam nie występuje i jest to agregacja wszystkich wartości atrybutu Size. W przypadku gdy zaznaczona zostanie wartość we fragmentatorze funkcja ISFILTERED wyniki prezentują się następująco:
Tym razem kolumna kolor została teraz przefiltrowana zarówno na poziomie wierszy (ponieważ wyświetlana teraz jest wartość dla wszystkich rozmiarów, które nie są czarne) jak i na poziomie Grnad Total ponieważ agregacja wyświetlana w tym miejscu pokazywała by wartość dla wszystkich rozmiarów oraz wszystkich kolorów nie licząc koloru czarnego. Jeśli chodzi o kolumnę Size to jest ona filtrowana tak jak poprzednio tj. poziom wierszy jest filtrowany przez atrybut umieszczony w sekcji wierszy natomiast podsumowanie nie jest bezpośrednio filtrowane.
ISCROSSFILTERED z kolei służy do identyfikacji tego czy filtr został przekazany w sposób niebezpośredni. Tak wiec stworzono dwie kolejne miary
IsColorCrossFiltered := ISCROSSFILTERED ( 'DimProduct'[Color] ) IsSizeCrossFiltered := ISCROSSFILTERED ( 'DimProduct'[Size] )
Wynik działania powyższych formuł został dodany do testowej tabeli przestawnej.
Jak widać miara IsColorCrossFiltered przyjmuje wartość TRUE ponieważ na poziomie wiersza wartość została zmieniona niebezpośrednio przez znajdujące się w wierszach wartości kolumny Size.
Do czego przydatne są tego typu funkcje? Dzięki nim możemy zdeterminować czy użytkownik przefiltrował jakieś pole czy też nie np. w przypadku gdy mamy do czynienia z semiaddytywnymi lub nieaddytywnymi miarami możemy zaszyć w nich logikę, iż coś musi zostać wybrane aby wyświetlić wartość – w takim przypadku funkcja ISFILTERED może okazać się niezbędna. Takich scenariuszy z całą pewnością znajdziecie całkiem sporo, a znajomość przedstawionych funkcji może okazać się przydatna.
- Avoiding Issues: Monitoring Query Pushdowns in Databricks Federated Queries - October 27, 2024
- Microsoft Fabric: Using Workspace Identity for Authentication - September 25, 2024
- Executing SQL queries from Azure DevOps using Service Connection credentials - August 28, 2024
Last comments