Kontext filtru v jazyku DAX

Power BI model

Jazyk DAX přinesl zcela nový revoluční koncept, který umožňuje opakované znovupoužití stejného výpočtu v jiném  prostředí. Pokud vytvoříme jedno měřítko, můžeme ho používat znovu a znovu v různých vizuálech s různými hodnotami v řádcích a filtrech, a výpočet v měřítku se automaticky přizpůsobuje prostředí, ve kterém je použito. Kdykoliv použijeme jakékoliv měřítko, říkáme že toto měřítko je vyhodnoceno v aktuálním kontextu vyhodnocení. Kontext vyhodnocení se skládá z kontextu řádku a kontextu filtru. Kombinace těchto dvou kontextů umožňuje pracovat s jazykem DAX jak začátečníkům, pro které je tento jazyk ze začátku obvykle velmi intuitivní a relativně jednoduchý, ale také pokročilým  uživatelům, kteří využívají detailní znalost kontextu řádku a kontextu filtru a dokáží tvořit velmi komplexní kalkulace. Tento příspěvek obsahuje základní popis kontextu filtru, informace o kontextu řádku můžete najít v samostatném příspěvku.

Kontext filtru

Kontext filtru je o soubor filtrů aplikovaných na model před vyhodnocením výrazu. Tento soubor filtrů aplikovaný na jednotlivé sloupce v tabulkách změní počet řádků v modelu, které budou dostupné pro vyhodnocení výrazu. Mezi více filtry je logický AND vztah. Kontext filtru prochází přes relace mezi tabulkami, pokud to směr filtrace nastavený na konkrétní relaci umožňuje.

Vyhodnocení měřítka v kontextu filtru

Příklady v tomto příspěvku jsou vytvořeny ve cvičném Power BI souboru Adventure Works DW 2020.pbix, který je volně dostupný ke stažení na internetu. Soubor s řešením je dostupný ke stažení níže pod tímto článkem. 
Pro znázornění fungování kontextu filtru si ve cvičném souboru můžeme vytvořit jednoduché měřítko, které vracet sumu za prodané produkty v aktuálním kontextu vyhodnocení.

Měřítko:

Prodeje = SUM(Sales[Sales Amount])

Nové měřítko můžeme vložit do vizuálu tabulky. Pokud na měřítko nepůsobí v době vyhodnocení žádný filtr, výsledkem je suma všech hodnot ze sloupce 'Sales'[Sales Amount].

Kontext filtru v jazyku DAX

Na obrázku výše je vidět suma všech hodnot ze sloupce 'Sales'[Sales Amount], protože před vyhodnocením výrazu není na model aplikován žádný filtr. Pokud přidáme do Power BI reportu průřez, například s roky z tabulky 'Date', a vybereme pouze rok 2020, výraz v měřítku [Prodeje] bude vyhodnocen v kontextu filtru roku 2020.

Kontext filtru v jazyku DAX 2

Nyní je hodnota měřítka [Prodeje] nižší než hodnota stejného měřítka vyhodnoceného bez jakéhokoliv filtru. Filtr aplikovaný na sloupec 'Date'[Rok] prochází přes relaci definovanou v modelu mezi tabulkou 'Sales' a tabulkou 'Date', a v době vyhodnocení měřítka je proto tabulka 'Sales' zafiltrována pouze na prodeje za vybraný rok

Kontext filtru v jazyku DAX 3

V Power BI reportech je obvykle v době vyhodnocení měřítka aktivních více filtrů. Pokud změníme vizuál Tabulky na vizuál Matrix, a přidáme do řádků hodnoty ze sloupce 'Reseller'[Country-Region] a do sloupců v Matrixu hodnoty ze sloupce 'Product'[Category], můžeme vidět, že výsledek měřítka [Prodeje] je v kontextu každého řádku a sloupce jiný.

Kontext filtru v jazyku DAX 4

Zvýrazněná buňka zobrazuje sumu za prodeje produktů v kategorii Accessories v roce 2020, prodané ve státě Canada. V době vyhodnocení měřítka ve zvýrazněné buňce působí na model všechny tyto tři filtry současně. Důležité je si uvědomit, že měřítko [Prodeje] je vyhodnoceno v každé buňce v jiném kontextu, který je složen z filtrů působících v řádcích vizuálu, sloupcích vizuálu a v průřezu. Před vyhodnocení měřítka [Prodeje] je na model aplikovaný soubor filtrů, mezi kterými je logický AND vztah. V každém řádku a sloupci zobrazeného vizuálu je výsledek výrazu v měřítku [Prodeje] jiný, protože také soubor filtrů působící na model před vyhodnocením měřítka je v každém řádku a sloupci vizuálu jiný.

Filtry v Power BI reportu mohou vznikat také v jiných vizuálech, jako jsou grafy, mapy, karty atd. Filtry mohou být nastaveny také ve filtrech stránek, ve filtrech vizuálů a nebo programově přímo v měřítku. Jazyk DAX nerozlišuje v jakém vizuálu je měřítko použito, na pozadí je každý filtr přeměněn na konkrétní hodnoty, které následně filtrují celý model.

Vytvoření filtru pomocí funkce CALCULATE

Kontext filtru můžeme programově změnit ve funkci CALCULATE(). Pokud bychom chtěli získat stejný výsledek, jaký je na obrázku výše ve zvýrazněné buňce, například ve vizuálu karta, kdy na výpočet nebudou působit žádné vnější filtry z průřezů nebo ze sloupců a řádků ve vizuálu Matrix, můžeme vypsat všechny filtry, kterými chceme ovlivnit výsledek výrazu v prvním argumentu funkce CALUCLATE(), vypsat přímo jako druhý a další argumenty funkce.

Měřítko:

Prodeje (Accessories, Canada, 2020) =
CALCULATE
(
    [Prodeje],
    'Product'[Category] = "Accessories",
    Reseller[Country-Region] = "Canada",
    'Date'[Rok] = 2020
)

Takto definované filtry ve funkci CALCULATE() nejdříve zafiltrují před vyhodnocením měřítka [Prodeje] v prvním argumentu funkce model stejně, jako tomu bylo u zvýrazněné buňky ve vizuálu Matrix v předcházející ukázce. Výsledná hodnota je proto také totožná jako hodnota ve zvýrazněné buňce na předcházejícím obrázku.

Kontext filtru v jazyku DAX 5

Nové měřítko [Prodeje (Accessories, Canada, 2020)] je použito ve vizuálu, na který nyní nepůsobí žádný vnější filtr. Přesto je výsledkem nového měřítka suma za prodané produkty v kategorii Accessories přes prodejce ve státě Canada a v roce 2020, protože tyto filtry jsou doplněny do výpočtu programově ve funkci CALCULATE(). Tímto způsobem se obvykle filtry ve funkci CALCULATE() nesestavují, nicméně jedná se o dobrý příklad pro pochopení toho, jak fungují filtry v jazyku DAX, protože si tímto způsobem můžeme explicitně definovat stejné filtry, ve kterých bylo měřítko vyhodnoceno ve zvýrazněné buňce v předcházejícím příkladu.

Funkce CALCULATE() se obvykle používá více  dynamickým způsobem, který umožňuje znuvupoužitelnost měřítka v jiných kontextech. Více informací o funkci CALCULATE() a různých typech filtrů můžete najít v samostatném příspěvku.

Shrnutí

Kontext filtru je přirozenou součástí reportů vytvořených nad Tabulárním modelem. Díky tomu můžeme vytvořit jedno měřítko, které vrací různé hodnoty v různých řádcích tabulek nebo v jiných vizuálech, podle kontextu filtru, ve kterém je měřítko vyhodnoceno. Při tvorbě měřítek bychom tedy měli myslet na to, kde budeme měřítko používat a jaký bude jeho výsledek v závislosti na kontextu filtru. Pokud chceme kontext filtru upravit, doplnit nebo odstranit, můžeme použít funkci CALCULATE(), která umožňuje manipulovat s filtry. Příspěvky popisující chování funkce CALCULATE(), včetně příkladů použití modifikátorů filtrů ve funkci CALCULATE(), můžete najít na stránce DAX - Průvodce. Praktické příklady s použitím jazyka DAX můžete najít na stránce DAX - Příklady.

Stáhnout soubor s řešením.
č. 6

Komentáře

  1. Nejlepší česky psaný blog o DAXu (nejen)

    OdpovědětVymazat
    Odpovědi
    1. Děkuji za zpětnou vazbu. Jsem rád že se Vám obsah líbí.

      Vymazat

Okomentovat