DAX funkce CALCULATE s ALLEXCEPT

Úvodní obrázek

Funkce ALLEXCEPT() může být v jazyku DAX použita jako funkce vracející tabulku nebo jako modifikátor funkcí CALCULATE() a CALCULATETABLE(). Tento článek popisuje chování funkce ALLEXCEPT() při použití jako modifikátoru CALCULATE()ALLEXCEPT() odstraňuje filtry z tabulky uvedené v prvním argumentu v její rozšířené verzi, kromě filtrů aplikovaných na sloupce, které jsou uvedené v druhém a dalších argumentech.

Příklady použití funkce ALLEXCEPT v měřítku

Než se dostaneme k samotným příkladům použití funkce ALLEXCEPT(), podívejme se nejdříve na syntaxi této funkce.

Syntaxe funkce ALLEXCEPT:

ALLEXCEPT(<table>,<column>[,<column>[,…]])

Prvním argumentem funkce ALLEXCEPT() je tabulka, ze které chceme odstranit filtry. Druhý a další argumenty jsou sloupce, na kterých chceme filtry zachovat. Pokud pracujeme s tabulkou, která ve své rozšířené verzi obsahuje i další tabulky, mohou být ve druhém a dalších argumentech této funkce uvedeny názvy celých tabulek, které patří do rozšířené verze tabulky uvedené v prvním argumentu.

Poznámka: Koncept rozšířených tabulek je podrobně popsán v samostatném příspěvku pod tímto odkazem

V příkladech budeme pracovat se cvičným Power BI souborem Adventure Works DW 2020 v jeho zjednodušené formě, který je k dispozici ke stažení níže pod tímto příspěvkem.

DAX funkce CALCULATE s ALLEXCEPT

Zvýrazněná tabulka 'Product' nemá ve své rozšířené verzi žádné další tabulky. Pokud bychom chtěli při výpočtu sumy prodejů odstranit všechny filtry z tabulky 'Product', a ponechat filtry na sloupci s kategoriemi produktů ze stejné tabulky, výpočet by mohl vypadat následovně.

Měřítko:

Prodeje ALL (Product) EXCEPT (Category) =
CALCULATE
(
    SUM(Sales[Sales Amount]),
    ALLEXCEPT('Product','Product'[Category])
)

Pro porovnání budeme pracovat také s měřítkem [Prodeje], které má následující definici a vrací sumu za prodané produkty v aktuálním kontextu vyhodnocení.

Měřítko:

Prodeje = SUM(Sales[Sales Amount])

Pokud do Power BI vizuálu Tabulka vložíme do řádků roky, a do hodnot měřítko [Prodeje] a měřítko [Prodeje ALL (Product) EXCEPT (Category)], výsledek obou měřítek je ve výchozím stavu stejný.

DAX funkce CALCULATE s ALLEXCEPT 2

Výsledek obou měřítek je stejný, protože roky v řádcích tabulky nejsou součástí tabulky 'Product', ze které odstraňujeme filtry. Pokud budeme v reportu pomocí průřezu filtrovat pouze modrou a černou barvu, hodnoty použitých měřítek již budou jiné.

DAX funkce CALCULATE s ALLEXCEPT 3

V měřítku [Prodeje ALL (Product) EXCEPT (Category)] se po použití filtru na sloupec s barvami (filtr v průřezu) nic nezměnilo. Sloupec s barvami 'Product'[Color] patří do tabulky 'Product'. Při výpočtu sumy prodejů dojde díky ALLEXCEPT() k odstranění všech filtrů z tabulky 'Product', kromě filtrů aplikovaných na sloupec s kategoriemi produktů. Měřítko [Prodeje] pak filtry z průřezů respektuje a vrací v každém roce pouze sumu prodejů za pro produkty s černou a modrou barvou.

Pokud ale zafiltrujeme v průřezu hodnoty ze sloupce s kategoriemi produktů, výsledek měřítka [Prodeje ALL (Product) EXCEPT (Category)] již tento filtr ovlivní.

DAX funkce CALCULATE s ALLEXCEPT 4

Hodnoty obou měřítek jsou stejné, protože ve funkci ALLEXCEPT(), kterou jsme použili jako modifikátor výsledku měřítka [Prodeje ALL (Product) EXCEPT (Category)] odstraňujeme filtry ze všech sloupců tabulky 'Product', kromě sloupce s kategoriemi produktů, který je filtrován v průřezu.

Nyní můžeme pro ilustraci do modelu k již existujícímu měřítku [Prodeje ALL (Product) EXCEPT (Category)] přidat jeho druhou verzi.

Měřítka:

Prodeje ALL (Product) EXCEPT (Category) =
CALCULATE
(
    SUM(Sales[Sales Amount]),
    ALLEXCEPT('Product','Product'[Category])
)
Prodeje ALL (Product) EXCEPT Category (v2) =
CALCULATE
(
    SUM(Sales[Sales Amount]),
    REMOVEFILTERS
    (
        'Product'[ProductKey],
        'Product'[Color],
        'Product'[List Price],
        'Product'[Model],
        'Product'[Product],
        'Product'[SKU],
        'Product'[Standard Cost],
        'Product'[Subcategory]          
    )
)

Pokud obě verze měřítek vložíme do vizuálu v reportu, můžeme na obrázku níže vidět, že obě verze vrací stejné hodnoty. V prvním měřítku odstraníme všechny filtry z tabulky 'Product', kromě filtrů na sloupec s kategoriemi. V druhém měřítku pomocí funkce REMOVEFILTERS() odstraňujeme všechny filtry z tabulky 'Product', opět kromě filtrů aplikovaných na sloupec s kategoriemi, který ve výčtu sloupců chybí. Jedná se tedy o zápis stejného dvěma způsoby.

DAX funkce CALCULATE s ALLEXCEPT 5

Výsledek měřítka [Prodeje ALL (Product) EXCEPT (Category)], stejně jako jeho ekvivalentu s odlišným způsobem odstranění filtrů, vrací v každém řádku zobrazené tabulky sumu prodejů za v řádcích uvedený rok a za vybrané kategorie v průřezu, bez ohledu na filtrované barvy.

Výše uvedené ukázky jsou poměrně intuitivní, protože tabulka 'Produkt' je tabulka, která ve své rozšířené verzi neobsahuje žádné další tabulky. Pokud ovšem upravujeme filtry pomocí modifikátorů, v některých situacích musíme brát v úvahu i rozšířené verze tabulek.

Funkce ALLEXCEPT a rozšířené tabulky

Při použití ALLEXCEPT() jako modifikátoru v CALCULATE() tato funkce odstraní všechny filtry z tabulky uvedené v prvním argumentu funkce a z její rozšířené verze, a ponechá pouze filtry na sloupcích z rozšířené verze tabulky v prvním argumentu, které jsou uvedeny v dalších argumentech funkce. Druhým a dalšími argumenty funkce mohou být sloupce z tabulky a z její rozšířené verze, nebo také celé tabulky patřící do rozšířené verze tabulky uvedené v prvním argumentu funkce.

Pokud se opět vrátíme k modelu v Power BI souboru Adventure Works DW 2020, můžeme vidět, že tabulka 'Sales' ve své rozšířené verzi obsahuje všechny tabulky v celém modelu, protože jsou všechny ostatní tabulky v modelu ve vztahu s tabulkou 'Sales' na straně ONE.

DAX funkce CALCULATE s ALLEXCEPT 6

Stejně jako v prvním příkladu při práci s tabulkou 'Product', i nyní vytvoříme podobné měřítko, pouze budeme odstraňovat pomocí funkce ALLEXCEPT() filtry z tabulky 'Sales' a její rozšířené verze, a opět ponecháme filtry na sloupci s kategoriemi.

Měřítko:

Prodeje ALL (Sales) EXCEPT (Category) =
CALCULATE
(
    SUM(Sales[Sales Amount]),
    ALLEXCEPT('Sales','Product'[Category])
)

Nyní, pokud vložíme nové měřítko [Prodeje ALL (Sales) EXCEPT (Category)] do původního reportu s roky v řádcích vizuálu Tabulky, můžeme si porovnat verzi výpočtu odstraňující filtry z tabulky 'Product' a verzi výpočtu odstraňující filtry z tabulky 'Sales'.

DAX funkce CALCULATE s ALLEXCEPT 7

Při pohledu na výsledek nového měřítka [Prodeje ALL (Sales) EXCEPT (Category)] je zřejmé, že hodnota v každém řádků odpovídá celkovým prodejům za všechny roky, bez ohledu filtr s roky, které jsou uvedeny v řádcích vizuálu. 

Na druhou stranu původní měřítko [Prodeje ALL (Product) EXCEPT (Category)] je filtrem působícím z řádků tabulky ovlivněno. Jelikož je tabulka 'Date' s roky součástí rozšířené verze tabulky 'Sales', tak stejného výsledku obou měřítek dosáhneme v případě, že u nového měřítka, které odstraňuje filtry z tabulky 'Sales', uvedeme sloupec s roky v argumentu funkce ALLEXCEPT() tak, aby z tohoto sloupce nebyly filtry odstraněny.

Měřítko:

Prodeje ALL (Sales) EXCEPT (Category, Rok) =
CALCULATE
(
    SUM(Sales[Sales Amount]),
    ALLEXCEPT('Sales','Product'[Category],'Date'[Rok])
)

Výsledek obou měřítek již bude nyní stejný.

DAX funkce CALCULATE s ALLEXCEPT 8

Na předchozím příkladu bylo vidět, jak je důležité při práci s filtry brát v úvahu i rozšířené verze tabulek v modelu. V měřítku [Prodeje ALL (Sales) EXCEPT (Category)] jsme sice přesně uvedli, že chceme odstranit filtry z tabulky 'Sales', nicméně došlo také k odstranění filtrů z tabulky 'Date', která obsahuje sloupec s roky, protože ta je součástí rozšířené verze tabulky 'Sales'.

V další ukázce vytvoříme měřítko, které bude respektovat filtry aplikované na sloupec s kategoriemi a nově také filtry aplikované na sloupec s barvami.

Měřítko:

Prodeje ALL (Sales) EXCEPT (Category, Color) =
CALCULATE
(
    SUM(Sales[Sales Amount]),
    ALLEXCEPT('Sales','Product'[Category],'Product'[Color])
)

Pokud vložíme nové měřítko do stejného vizuálu v Power BI, který má v řádcích kategorie, a v průřezu nastavíme filtr pouze na černou a modrou barvu, výsledek bude vypadat následovně.

DAX funkce CALCULATE s ALLEXCEPT 9

Výsledek nového měřítka [Prodeje ALL (Sales) EXCEPT (Category, Color)] je stejný jako výsledek měřítka [Prodeje], protože nové měřítko respektuje filtry aplikované na sloupec s barvami v průřezu, tak i filtr aplikovaný na sloupec s kategoriemi v řádcích vizuálu tabulky. Pokud v průřezu s roky zafiltrujeme rok 2018, výsledek je následující.

DAX funkce CALCULATE s ALLEXCEPT 10

Měřítko [Prodeje] ve zvýrazněné buňce představuje sumu prodejů černých a modrých kol za rok 2018. Měřítko [Prodeje ALL (Sales) EXCEPT (Category, Color)] ve zvýrazněné buňce vrací sumu za prodeje modrých a černých kol, ale za všechny roky.

Shrnutí

Chování funkce ALLEXCEPT() jako funkce pro úpravu filtrů ve funkci CALCULATE() je jednoduché, odstraní filtry z tabulky uvedené v prvním argumentu, kromě filtrů aplikovaných na sloupce uvedené ve druhém a dalších argumentech. V případě že tabulka v prvním argumentu funkce ALLEXCEPT() obsahuje ve své rozšířené verzi i další tabulky, dojde k odstranění filtrů i ze sloupců z tabulek patřících do rozšířené verzi tabulky, pokud tyto sloupce nebo tabulky neuvedeme ve druhém a dalších argumentech funkce ALLEXCEPT().

Informace o dalších funkcích určených pro úpravu filtrů ve funkci CALCULATE() můžete najít na stránce Jazyk DAX. Praktické příklady pak můžete najít na stránce DAX - Příklady.

č. 18

Komentáře