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:
- do oblasti hodnôt dáme merítko Obrat z tabuľky Objednávky,
- 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:
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:
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 🙂
Autor, tréner a expert na PowerPivot, Power BI a jazyk DAX. Založil som tento web, aby som pomohol dostať PowerPivot a Power BI do širšieho povedomia, a aby som ľuďom ukázal, že aj komplexné analytické problémy idú riešiť jednoducho. Po nociach vzývam Majstra Yodu a tajne plánujem ovládnutie vesmíru.