DAX funkce ISFILTERED a ISCROSSFILTERED

Úvodní obrázek

V Tabulárním modelu mohou být sloupce v tabulce filtrované přímo nebo nepřímo. Funkce ISFILTERED() vrací hodnotu TRUE, pokud je sloupec nebo tabulka uvedená v argumentu této funkce filtrována přímo. Funkce ISCROSSFILTERED() vrací hodnotu TRUE, pokud je sloupec nebo tabulka uvedená v argumentu této funkce filtrována přímo a nebo nepřímo. Sloupec je filtrovaný nepřímo, pokud jsou hodnoty v tomto sloupci filtrovány pomocí jiného sloupce ze stejné tabulky. Sloupec nebo tabulka mohou být filtrovány nepřímo také v případě propagace filtru z jiné tabulky prostřednictvím relace.

Funkce ISFILTERED a ISCROSSFILTERED

V první ukázce si můžeme ve cvičném Power BI souboru Adventure Works DW 2020.pbix si vytvořit následující dvě jednoduchá měřítka. 

Měřítka:

IsFiltered Category = ISFILTERED('Product'[Category])

IsCrossFiltered Category = ISCROSSFILTERED('Product'[Category])

Pokud obě nová měřítka vložíme v Power BI reportu do vizuálu Tabulka, spolu s hodnotami ze sloupce 'Product'[Color] v řádcích tabulky, můžeme vidět rozdíl mezi funkcí ISFILTERED() a funkcí ISCROSSFILTERED().

DAX funkce ISFILTERED a ISCROSSFILTERED

Měřítko [IsFiltered Category] vrací v každém řádku tabulky hodnotu FALSE, protože při vyhodnocení měřítka nepůsobí na sloupec 'Product'[Category], uvedený v argumentu této funkce, žádný přímý filtr. Měřítko [IsCrossFiltered Category] pak vrací v každém řádku tabulky hodnotu TRUE, kromě řádku souhrnů. V řádcích tabulky jsou barvy produktů, které jsou ve stejné tabulce jako kategorie produktů. Pokud je filtrován sloupec s barvami produktů, nepřímo je filtrován také sloupec s kategoriemi produktů. 

Při vyhodnocení funkcí ISFILTERED() a ISCROSSFILTERED() není důležité, z jakého vizuálu filtry pochází. Filtry mohou vznikat v řádcích tabulky, v grafech, v průřezech, ve filtrech stránky reportu atd. Pokud například přidáme do reportu průřez s kategoriemi produktů, a vybereme pouze některé kategorie, výsledek bude vypadat následovně.

DAX funkce ISFILTERED a ISCROSSFILTERED 2

Nyní již obě měřítka vrací v každém řádku tabulky hodnotu TRUE. Měřítko [IsCrossFiltered Category] vrací hodnotu TRUE také v řádku souhrnů, kde nepůsobí na výpočet žádný filtr ze sloupce s barvami produktů. V řádku souhrnů působí na obě měřítka pouze filtr z průřezu. Je tedy zřejmé, že funkce ISCROSSFILTERED() vrací hodnotu TRUE když je sloupec uvedený v argumentu  této funkce filtrovaný nepřímo, ale i když je sloupec uvedený v argumentu této funkce filtrovaný přímo, protože v řádku souhrnů působí na měřítko [IsCrossFiltered Category] pouze přímý filtr nastavený na konkrétní kategorie v průřezu.

To, že působí na konkrétní sloupec filtr, ať už přímý nebo nepřímý, ještě nemusí znamenat, že v době vyhodnocení nejsou v aktuálním kontextu dostupné všechny hodnoty z použitého sloupce. V modelu si můžeme vytvořit měřítko, které bude počítat počet jedinečných hodnot ze sloupce 'Product'[Category], které jsou dostupné v aktuálním kontextu vyhodnocení.

Měřítko:

Počet hodnot Category = COUNTROWS(VALUES('Product'[Category]))

V použitém modelu jsou v tabulce 'Product' produkty rozděleny do čtyř kategorií. Pokud měřítko [Počet hodnot Category] bude vracet hodnotu 4, znamená to, že v aktuálním kontextu jsou dostupné všechny čtyři kategorie. Pokud přidáme nové měřítko do původního vizuálu tabulky, a v průřezu vybereme všechny čtyři kategorie, výsledek může vypadat následovně.

DAX funkce ISFILTERED a ISCROSSFILTERED 3

Jak můžeme vidět na obrázku výše, měřítka [IsFiltered Category] a [IsCrossfiltered Category] vrací v každém řádku tabulky hodnotu TRUE, včetně řádku souhrnů. To ale ještě neznamená, že filtry působící na sloupec s kategoriemi produktů, ať už přímo, nebo nepřímo, musí omezovat počet položek ze sloupce s kategoriemi produktů dostupných v aktuálním kontextu vyhodnocení. V průřezu jsou filtrované všechny čtyři kategorie, a pokud se současně produkty ve vybrané barvě prodávají ve všech kategoriích, v aktuálním řádku budou dostupné všechny čtyři kategorie, i když je sloupec s kategoriemi produktů filtrovaný přímo i nepřímo. V prvních dvou řádcích tabulky jsou proto i přes filtry nastavené v průřezu a v řádcích tabulky dostupné všechny čtyři kategorie produktů. To samé platí pro řádek souhrnů.  Pokud je hodnota měřítka [Počet hodnot Category] v řádcích vizuálu menší než 4, znamená to že ve vybrané barvě se neprodávají produkty ze všech kategorií.

Filtry nastavené na konkrétní sloupec v jedné tabulce mohou nepřímo filtrovat také hodnoty v tabulce provázané pomocí relace, pokud to směr filtrace umožňuje. 

DAX funkce ISFILTERED a ISCROSSFILTERED 4

V použitém cvičném modelu filtry nastavené na sloupce z tabulky 'Product' filtrují automaticky také tabulku 'Sales', právě díky relaci mezi těmito tabulkami. Do modelu si můžeme přidat následující dvě měřítka, abychom si výše popsanou vlastnost mohli znázornit.

Měřítka:

IsCrossFiltered Sales table = ISCROSSFILTERED(Sales)

IsCrossFiltered OrderDate column = ISCROSSFILTERED(Sales[Order Date])

Pokud vložíme obě nová měřítka do vizuálu tabulky, opět s barvami produktů v řádcích, které budou tvořit filtr v každém řádku vizuálu nastavený na konkrétní barvu, výsledek může vypadat následovně.

DAX funkce ISFILTERED a ISCROSSFILTERED 5

Jak je možné vidět na výše uvedeném obrázku, filtr nastavený na konkrétní barvy filtruje nepřímo celou tabulku 'Sales', ale také konkrétní sloupce z této tabulky. Filtr nastavený na kterýkoliv sloupec v tabulce 'Product' automaticky filtruje také sloupce v tabulce 'Sales', díky relaci nastavené mezi těmito dvěma tabulkami. 

Příklady uvedené v tomto příspěvku samozřejmě nemají žádné praktické využití. Funkce ISFILTERED() a ISCROSSFILTERED() obvykle používáme jako součást komplexních DAX výrazů. Praktické příklady, některé také s využitím funkce ISFILTERED(), můžete najít na stránce DAX – Příklady.

Shrnutí

Cílem příspěvku bylo vysvětlit fungování funkcí ISFILTERED() a ISCROSSFILTERED(). Současně mohou být ukázky uvedené v tomto příspěvku dobrým cvičením, jak funguje propagace filtrů mezi sloupci v jedné tabulce nebo mezi tabulkami spojenými relacemi. Důležité je také mít na paměti, že i když je některý sloupec filtrovaný, ať už přímo nebo nepřímo, nemusí to vždy znamenat, že v aktuálním kontextu vyhodnocení nejsou dostupné všechny hodnoty z tohoto sloupce. 

Oficiální Microsoft dokumentace funkcí ISFILTERED a ISCROSSFILTERED:
https://docs.microsoft.com/cs-cz/dax/isfiltered-function-dax
https://docs.microsoft.com/cs-cz/dax/iscrossfiltered-function-dax

Komentáře