DAX funkce CALCULATE s ALLEXCEPT

Power BI model

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 a z její rozšířené verze, kromě filtrů aplikovaných na sloupce, které jsou uvedené v druhém a dalších argumentech funkce.

Příklad ALLEXCEPT

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.

V příkladech budeme pracovat se cvičným Power BI souborem Adventure Works DW 2020, který obsahuje tabulky zobrazené na následujícím obrázku.

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:

(Product) Prodeje ALLEXCEPT 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 Tabulky vložíme do řádků roky, a do hodnot měřítko [Prodeje] a měřítko [(Product) Prodeje ALLEXCEPT 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 [(Product) Prodeje ALLEXCEPT 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 [(Product) Prodeje ALLEXCEPT 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 [(Product) Prodeje ALLEXCEPT 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 [(Product) Prodeje ALLEXCEPT Category] přidat jeho druhou verzi.

Měřítka:

(Product) Prodeje ALLEXCEPT Category =
CALCULATE
(
    SUM(Sales[Sales Amount]),
    ALLEXCEPT('Product','Product'[Category])
)
(Product) Prodeje ALLEXCEPT Category2 =
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 [(Product) Prodeje ALLEXCEPT Category], stejně jako jeho ekvivalentu s odlišným zápisem filtrů, vrací v každém řádku zobrazené tabulky sumu prodejů za v řádcích uvedený fiskální 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:

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

Nyní, pokud vložíme nové měřítko [(Sales) Prodeje ALLEXCEPT 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 [(Sales) Prodeje ALLEXCEPT 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 fiskálními roky, které jsou uvedeny v řádcích vizuálu. 

Na druhou stranu původní měřítko [(Product) Prodeje ALLEXCEPT 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:

(Sales) Prodeje ALLEXCEPT Category and FY =
CALCULATE
(
    SUM(Sales[Sales Amount]),
    ALLEXCEPT('Sales','Product'[Category],'Date'[Fiscal Year])
)

Výsledek obou měřítek již bude opět 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 [(Sales) Prodeje ALLEXCEPT Category] jsme sice přesně uvedli, že chceme odstranit filtry z tabulky 'Sales', nicméně došlo také k odstranění filtrů i 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:

(Sales) Prodeje ALLEXCEPT Category a 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 [(Sales) Prodeje ALLEXCEPT Category a 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 fiskální 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 fiskální rok 2018. Měřítko [(Sales) Prodeje ALLEXCEPT Category a Color] ve zvýrazněné buňce představuje sumu prodejů modrých a černých kol, ale za všechny roky.

Shrnutí 

Chování funkce ALLEXCEPT() jako funkce pro úpravu filtrů je jednoduché, odstraní filtry z tabulky uvedené v prvním argumentu, kromě filtru 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