DAX funkce CALCULATE s REMOVEFILTERS

Úvodní obrázek

Funkce REMOVEFILTERS() se používá pro odstraňování filtrů ve funkci CALCULATE(). Funkce REMOVEFILTERS() má stejné chování jako funkce ALL(), pokud je ALL() použita jako funkce pro úpravu filtrů ve funkci CALCULATE(). V tomto příspěvku najdete příklady použití funkce REMOVEFILTERS() bez argumentu, s argumentem ve formě tabulky a s argumentem ve formě sloupce.

Příklady použití funkce REMOVEFILTERS

Níže jsou uvedeny ukázky použití funkce REMOVEFILTERS() bez argumentu, s argumentem ve formě tabulky a s argumentem ve formě sloupce. Rozdíl mezi použitím REMOVEFILTERS() a ALLSELECTED() je popsán v samostatném příspěvku.

Funkce REMOVEFILTERS bez argumentu

Pokud je funkce použita bez jakéhokoliv argumentu, odstraní všechny filtry z celého modelu, které jsou aktivní při vyhodnocení funkce CALCULATE() nebo CALCULATETABLE(). Jako ukázku si můžeme ve cvičném souboru Contoso Sales Sample for Power BI Desktop.pbix vytvořit následující dvě měřítka.

Měřítka:

Prodeje = SUM(Sales[SalesAmount])

Prodeje (REMOVEFILTERS) =
CALCULATE
(
    SUM(Sales[SalesAmount]),
    REMOVEFILTERS()
)

Měřítko [Prodeje] je definované jako suma hodnot ze sloupce 'Sales'[SalesAmount]. Měřítko [Prodeje (REMOVEFILTERS)] počítá také sumu hodnot ze sloupce 'Sales[SalesAmount], ale před vyhodnocením výrazu v prvním argumentu funkce dojde díky funkci REMOVEFILTERS() k odstranění všech filtrů z celého modelu. Rozdíl můžeme vidět na následujícím obrázku, kde jsou použita obě měřítka v jedné tabulce. Tabulka obsahuje kategorie produktů v řádcích a je filtrována pomocí průřezu s roky z kalendářní tabulky.

DAX funkce CALCULATE s REMOVEFILTERS

V prvním řádku výše zobrazené tabulky je kategorie Audio ze sloupce 'ProductCategory'[ProductCategory]. Vyhodnocení měřítka [Prodeje] v prvním řádku probíhá v kontextu filtru roků 2011 a 2012, díky filtru nastavenému v průřezu, a v kontextu filtru kategorie Audio, díky filtru který působí na měřítko z řádku zobrazené tabulky.

Měřítko [Prodeje (REMOVEFILTERS)] vrací stejnou hodnotu v každém řádku vizuálu, která odpovídá celkovým prodejům za všechny roky a všechny kategorie, protože funkce REMOVEFILTERS() odstraní před vyhodnocením prvního argumentu funkce CALCULATE() všechny filtry z celého modelu. Takto vytvořené měřítko není samo o sobě příliš užitečné. Tyto výpočty jsou obvykle součástí složitějších měřítek, ve kterých chceme počítat například podíly na celku nebo jiné dílčí výpočty které ignorují aktuální filtry.

Funkce REMOVEFILTERS s argumentem ve formě tabulky

Pokud použijeme jako argument funkce REMOVEFILTERS() tabulku, dojde před vyhodnocením prvního argumentu funkce CALCULATE() k odstranění všech filtrů aplikovaných na danou tabulku a její rozšířenou verzi. Pro znázornění si můžeme vytvořit následující nové měřítko.

Měřítko:

Prodeje (REMOVEFILTERS Calendar) =
CALCULATE
(
    SUM(Sales[SalesAmount]),
    REMOVEFILTERS('Calendar')
)

Nově vytvořené měřítko můžeme vložit do stejného vizuálu a porovnat výsledek s měřítkem [Prodeje].

DAX funkce CALCULATE s REMOVEFILTERS 2

Měřítko [Prodeje] je vyhodnoceno v každém řádku v kontextu filtru dané kategorie a v kontextu filtrovaných roků 2011 a 2012. Výraz v měřítku [Prodeje (REMVOEFILTERS Calendar)] je pak vyhodnocen v kontextu filtru kategorií, které jsou v řádcích tabulky, ale filtr přicházející z průřezu je díky výrazu REMOVEFILTRES('Calendar') odstraněn. Výraz REMOVEFILTRES('Calendar') odstraní před vyhodnocením výrazu v měřítku všechny filtry z tabulky 'Calendar'. Protože je sloupec s roky v průřezu z této tabulky, dojde před vyhodnocením výrazu v měřítku  [Prodeje (REMVOEFILTERS Calendar)] k odstranění tohoto filtru.

Funkce REMOVEFILTERS s argumentem ve formě sloupce

Funkce REMOVEFILTERS() s argumentem ve formě sloupce odstraní před vyhodnocením prvního argumentu funkce CALCULATE() všechny filtry aplikované na sloupec uvedený jako argument této funkce. Pro znázornění si opět můžeme vytvořit nové měřítko.

Měřítko:

Prodeje (REMOVEFILTERS ClassName) =
CALCULATE
(
    SUM(Sales[SalesAmount]),
    REMOVEFILTERS('Product'[ClassName])
)

V měřítku [Prodeje (REMOVEFILTERS ClassName)] dojde před vyhodnocením výrazu v prvním argumentu k odstranění filtrů ze sloupce 'Product'[ClassName]. Pro znázornění vložíme hodnoty z tohoto sloupce do průřezu, a do řádku v tabulce vložíme hodnoty ze sloupce 'Product'[BrandName], tedy hodnoty z jiného sloupce stejné tabulky, tabulky 'Product'.

DAX funkce CALCULATE s REMOVEFILTERS 3

Měřítko [Prodeje] je v prvním řádku tabulky vyhodnoceno v kontextu filtru značky Fabrikam ze sloupce 'Product'[BrandName] a v kontextu filtru třídy Deluxe ze sloupce 'Product'[ClassName], tedy filtru vybraného v průřezu.

Měřítko [Prodeje (REMOVEFILTERS ClassName)] vrací v prvním řádku tabulky hodnotu prodejů všech produktů značky Fabrikam, bez ohledu na filtr aplikovaný na sloupec 'Product'[ClassName] v průřezu, který je před vyhodnocením výpočtu v prvním argumentu funkce CALCULATE() odebrán díky výrazu REMOVEFILTERS('Product'[ClassName]).

Funkce REMOVEFILTERS a rozšířené tabulky

Pokud použijeme jako argument funkce REMOVEFILTERS() tabulku, dojde k odstranění filtrů z dané tabulky a také z její rozšířené verze. Tabulka ve své rozšířené verzi obsahuje všechny své vlastní sloupce a také všechny sloupce z tabulek, které jsou s uvažovanou tabulkou ve vztahu MANY-TO-ONE na straně ONE. Tuto vlastnost si můžeme opět ukázat na příkladu.
V modelu Contoso Sales Sample for Power BI desktop obsahuje tabulka 'Product' ve své rozšířené verzi také sloupce z tabulek 'ProductSubcategory' a 'ProductCategory', protože tyto dvě tabulky jsou ve vztahu MANY-TO-ONE na straně ONE.

DAX funkce CALCULATE s REMOVEFILTERS 4

Měřítko, které použijeme pro tento příklad, vypadá následovně.

Měřítko:

Prodeje (REMOVEFILTERS Product) =
CALCULATE
(
    SUM(Sales[SalesAmount]),
    REMOVEFILTERS('Product')
)

Pokud takto definované měřítko vložíme do vizuálu tabulky, kde jsou v řádcích hodnoty ze sloupce 'Product'[BrandName], výsledek měřítka bude podle očekávání v každém řádku stejný.

DAX funkce CALCULATE s REMOVEFILTERS 5

Výsledek měřítka [Prodeje (REMOVEFILTERS Product)] je v každém řádku zobrazené tabulky stejný, protože sloupec 'Product'[BrandName], který je v řádcích tabulky a který tvoří kontext filtru při vyhodnocení měřítka, je součástí tabulky 'Product', ze které jsou před vyhodnocením prvního výrazu v měřítku  [Prodeje (REMOVEFILTERS Product)] odebrány všechny filtry ze všech sloupců.

Pokud bychom k tabulce přidali průřez s hodnotami ze sloupce 'ProductCategory'[ProductCategory], který je v jiné tabulce, než ze které odstraňujeme filtry pomocí výrazu REMOVEFILTERS('Product'), výsledek může být překvapivý.

DAX funkce CALCULATE s REMOVEFILTERS 6

Měřítko [Prodeje (REMOVEFILTERS Product)] vrací opět v každém řádku tabulky stejnou hodnotu, která se rovná celkovým prodejů všech produktů bez ohledu na filtr přicházející z řádků tabulky nebo z průřezu. I když v měřítku odstraňujeme filtry z tabulky 'Product', došlo k odstranění filtrů také z tabulky 'ProductCategory'. Z této tabulky jsme použili sloupec 'ProductCategory'[ProductCategory] v průřezu, kde jsou vybrané hodnoty Cell phones a Computers. Tento filtr je však před výpočtem výrazu v měřítku [Prodeje (REMOVEFILTERS Product)] odstraněn, protože odstraněním filtru z tabulky 'Product' dojde k odstranění filtrů z dané tabulky a z její rozšířené verze, do které patří také tabulka 'ProductCategory' a všechny sloupce v této tabulce.

Pro zdůraznění rozdílu mezi odstraněním filtru z celé tabulky a odstraněním filtru ze sloupce si můžeme definovat v modelu následující měřítko.

Měřítko:

Prodeje (REMOVEFILTERS BrandName) =
CALCULATE
(
    SUM(Sales[SalesAmount]),
    REMOVEFILTERS('Product'[BrandName])
)

V měřítku [Prodeje (REMOVEFILTERS BrandName)] je ve funkci REMOVEFILTERS() uveden konkrétní sloupec, ze kterého chceme odstranit filtr. Takto definované měřítko přidáme pro porovnání do dříve vytvořeného vizuálu.

DAX funkce CALCULATE s REMOVEFILTERS 7

Nově definované měřítko ignoruje filtry aplikované na sloupec 'Product'[BrandName], který je vložený v řádcích tabulky. Měřítko v každém řádku tabulky vrací sumu za prodeje všech produktů v kategoriích Cell phones a Computers.

Rozdíl mezi měřítkem [Prodeje (REMOVEFILTERS Product)], ve kterém odstraňujeme filtry z tabulky 'Product', a měřítkem [Prodeje (REMOVEFILTERS BrandName)], ve kterém odstraňujeme filtr z konkrétního sloupce, je zřejmý. [Prodeje (REMOVEFILTERS Product)] ignoruje filtry ze všech sloupců tabulky 'Product', ale také z tabulek, které patří do její rozšířené verze. Měřítko  [Prodeje (REMOVEFILTERS BrandName)] ignoruje filtry pouze ze sloupce 'Product'[ProductBrand], a všechny ostatní filtry při vyhodnocení prvního výrazu ve funkci CALCULATE() ponechává.

Shrnutí

Funkce REMOVEFILTERS() odstraní filtry ze sloupců nebo tabulek použitých jako argumenty této funkce. Pokud funkci REMOVEFILTERS() použijeme bez argumentu, dojde k odstranění filtrů ze všech sloupců v celém modelu. Použití funkce REMOVEFILTERS() je poměrně intuitivní až do chvíle, kdy použijeme tuto funkci s argumentem ve formě tabulky. Pokud použitá tabulka obsahuje ve své rozšířené verzi také další tabulky, funkce REMOVEFILTERS() odstraní i případné filtry z těchto tabulek patřících do rozšířené verze použité tabulky. 

Praktické příklady, některé také s použitím funkce REMOVEFILTERS(), můžete najít na stránce DAX - příklady.

č. 9

Komentáře