Ako detegovať úroveň v kontingenčke v jazyku DAX, v PowerPivote aj Power BI

Jazyk DAX nemá žiadnu podporu pre prácu s úrovňami, resp. hierarchiami, na rozdiel od jazyka MDX. Preto mnohí nevedia, ako spraviť rôzne výpočty na rôznych úrovniach v kontingenčke. Keď však vieme, ako funguje kontext výpočtu, a využijeme jeho úplne základné vlastnosti, tak vieme detegovať úroveň v kontingenčke celkom ľahko.

Začíname

Ukážeme si to opäť na našom vzorovom súbore PowerPivotu, resp. Power BI. Vytvoríme si takúto kontingenčku:

  1. do oblasti hodnôt dáme merítko Obrat z tabuľky Objednávky,
  2. do oblasti riadkov dáme stĺpce CalendarYear, MonthName a DayNumberOdMonth z tabuľky Čas.

Výsledná kontingenčka, po rozkliknutí náhodného roka a mesiaca, bude vyzerať takto:

A teraz potrebujeme nejaký spôsob, ako detegovať, a prípadne aj zobraziť to, na ktorej úrovni kontingenčky sme.

To si spravíme jednoduchým merítkom. Najprv si však spravíme rozbor kontextu výpočtu.

Úrovne v jazyku DAX

V jazyku DAX neexistuje pojem úrovní. Máme síce hierarchie, ktoré sú vyskladané zo stĺpcov, a jednotlivé stĺpce v hierarchiách sa nazývajú úrovne, ale jazyk DAX paradoxne nemá žiadnu priamu funkciu, ktorá by nám povedala, na ktorej úrovni sme. Pretože DAX jednoducho s úrovňami nepracuje.

Namiesto toho si potrebujeme uvedomiť, aké filtre máme v kontexte výpočtu na každej úrovni, a zariadiť sa podľa toho. Pretože každá úroveň je nepriamo definovaná cez kontextové filtre. Čím vyššia úroveň, tak tým menej filtrov, a čím nižšia úroveň, tak tým viac filtrov má nastavená konkrétna počítaná bunka v kontingenčke.

Keď si napríklad vyberieme toto políčko na úrovni roka:

…tak to políčko má nastavený 1 kontextový filter, a to CalendarYear = 2001.

Keď si potom vyberieme napríklad toto políčko na úrovni mesiaca:

…tak to políčko má nastavené 2 kontextové filtre. A to CalendarYear = 2001 a MonthName = September.

No a keď si vyberieme napríklad toto políčko na úrovni dňa:

…tak to políčko má nastavené 3 kontextové filtre. A to CalendarYear = 2001, MonthName = September a DayNumberOfMonth = 3.

A to teraz využijeme.

Ako detegovať úroveň v jazyku DAX

Riešením je napísať takéto merítko, ktorým si budeme zisťovať, na ktorej úrovni sme:

Úroveň := 
SWITCH(TRUE();
       HASONEFILTER('Čas'[DayNumberOfMonth]); "deň";
       HASONEFILTER('Čas'[MonthName]); "mesiac";
       HASONEFILTER('Čas'[CalendarYear]); "rok";
       "iná")

Po dosadení merítka do kontingenčky to vráti takýto výsledok:

Ako detegovať úroveň v jazyku DAX v kontingenčke, v PowerPivote aj Power BI

V tomto vzorci postupne otestujeme smerom od najnižšej úrovne po najvyššiu, či na nej “sme” alebo nie, a ako výsledok vrátime názov danej úrovne. A ak nie sme na žiadnej z nami implementovaných úrovní, tak vrátime slovíčko “iná”.

Funkciu SWITCH použijeme namiesto viacerých IF-ov, len z čírej pohodlnosti. Pre tých, čo ju náhodou nepoznáte, tak funguje podobne ako príkaz “switch”, “case” či “select case” v programovacích jazykoch.

Funkciu HASONEFILTER použijeme klasickým spôsobom na otestovanie, či je nastavený 1-hodnotový filter nad zadaným stĺpcom v kontexte výpočtu merítka. A ideme postupne vylučovacím spôsobom, od najnižšej úrovne po najvyššiu. Ak je nastavený filter nad stĺpcom reprezentujúcim deň – DayNumberOfMonth, tak vráť že si na úrovni dňa. Inak ak je nastavený filter nad stĺpcom reprezentujúcim mesiac – MonthName (a nie je nastavený nad stĺpcom DayNumberOfMonth), tak vráť že si na úrovni mesiaca. A podobne to funguje aj na úrovni roka. Dajte si len pozor, aby ste to testovali smerom od najnižšej úrovne po najvyššiu, inak dostanete “zaujímavé” výsledky 😀

Namiesto funkcie HASONEFILTER viete využiť aj funkciu ISINSCOPE, úplne identickým spôsobom.

Hierarchie a ako detegovať úroveň v jazyku DAX

Dobre, ale čo s hierarchiami? Ako detegovať úroveň v nich, keď sme ich použili v kontingenčke namiesto samostatných stĺpcov?

V tomto prípade si stačí uvedomiť, že hierarchia je len metadátový trik v dátovom modeli, a že je to virtuálny objekt vyskladaný zo stĺpcov. Pričom za každou úrovňou hierarchie je jeden konkrétny stĺpec. Potom stačí vo vzorci vyššie použiť pri testovaní názvy tých stĺpcov, z ktorých bola hierarchia vyskladaná. Ak si to neviete zistiť, tak si to pozrite napr. cez Power BI Analyzer.

Čiže keď namiesto stĺpcov CalendarYear, MonthName a DayNumberOfMonth, dosadíme do kontingenčky hierarchiu Rok-Mesiac-Deň z tabuľky Čas (ktorá je vytvorená z tých istých stĺpcov), a rozklikneme si kontingenčku opäť na úroveň dní, tak to zafunguje bezo zmeny vzorca:

Ako detegovať úroveň v jazyku DAX pre hierarchie, v PowerPivote aj Power BI

Na záver

Takže takto jednoducho viete v kontingenčke detegovať úroveň v jazyku DAX, či už v PowerPivote alebo v Power BI. A podľa toho sa zariadiť pri ďalších výpočtoch. Ako aj v iných prípadoch, aj teraz stačilo vedieť základy kontextu výpočtu a práce s ním, a nakoniec to bola hračka 🙂