Dynamická zmena zobrazovaných jednotiek v Power BI a PowerPivote

Užívatelia potrebujú v reportoch zobrazovať výsledky v rôznych jednotkách. Niekedy ako presné čísla, inokedy v tisícoch, miliónoch či miliardách. Toto nie je problém nastaviť cez formátovanie vizuálov v Power BI, prípadne cez jazyk DAX v excelovskom PowerPivote. Problém však nastáva vtedy, keď si to užívateľ chce meniť počas zobrazovania reportu. V takom prípade to je potrebné implementovať tak, že sa použije dynamická zmena zobrazovaných jednotiek.

Prečo je potrebná dynamická zmena zobrazovaných jednotiek?

Dynamická zmena zobrazovacích jednotiek je typický užívateľský “problém”, ktorý z pohľadu tvorcov reportov vyzerá byť ako malichernosť, ale nie je. Užívatelia to potrebujú častokrát nielen kvôli flexibilite zobrazovaných štatistík, ale aj kvôli rýchlosti rozhodovania. Napríklad, čím vyššia úroveň manažmentu, tým vyššie jednotky, ktoré ich zaujímajú. Vyšší manažment častokrát vôbec nezaujímajú presné čísla, ale chcú vedieť, koľko je to v miliónoch či miliardách, aby si to vedeli dať rýchlo do kontextu s aktuálne riešenými záležitosťami, a rýchlo rozhodnúť o ďalšom postupe. Preto navonok nepodstatná drobnosť je dôležitou záležitosťou z pohľadu tých najdôležitejších užívateľov – používateľov reportov, ktorí podľa nich rozhodujú, čo sa bude a nebude diať ďalej.

Dynamická zmena zobrazovacích jednotiek sa dá implementovať rôznymi spôsobmi. Častokrát sa kvôli neznalosti implementuje ako rôzne kópie tej istej strany reportu, na ktorých sa nastavia iné zobrazovacie jednotky. To však nie je vhodné z pohľadu následnej údržby a rozvíjania reportov, pretože si tým niekoľkokrát znásobíme prácu pri budúcich úpravách takéhoto reportu. Preto si ukážeme profesionálne riešenia. Pre jednoduchosť si ukážeme dve riešenia – najprv jedno jednoduchšie, ktoré bude fungovať v Power BI, PowerPivote či všetkých implementáciách SSAS Tabularu. A potom druhé pokročilejšie, ktoré síce nebude fungovať v excelovskom PowerPivote, ale zafunguje v modernejších verziách Power BI a SSAS Tabularu.

Obe riešenia si ukážeme na našom vzorovom súbore Power BI, resp. PowerPivotu.

Spravíme si kontingenčku, kde:

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

Výsledná kontingenčka bude vyzerať takto:

A teraz potrebujeme nejakým jednoduchým spôsobom implementovať dynamickú zmenu zobrazovacích jednotiek pre užívateľov reportu. My zvolíme to najjednoduchšie z pohľadu užívateľa – tlačítka. Pomocou nich si to bude vedieť zmeniť každý z nich.

Dynamická zmena zobrazovacích jednotiek cez odpojené slicery

Prvé riešenie využíva techniku odpojených slicerov, ktorá je uvedená v mojej knihe o Power BI. Jej výhodou je to, že je ľahká na pochopenie, a bude fungovať v Power BI, excelovskom PowerPivote, SSAS Tabulare aj Azure Analysis Services. Pridáme si do dátového modelu takúto novú tabuľku:

Túto tabuľku potom použijeme pre odpojený slicer. V prvom stĺpci sú textové možnosti, z ktorých vyrobíme tlačítka sliceru, a ktorými si užívateľ bude vyberať zobrazované jednotky. V druhom stĺpci je poradové číslo týchto budúcich tlačítok, aby sa zobrazili v takom poradí, ako to chceme my, a nie v abecednom poradí. A v treťom stĺpci je koeficient prepočtu jednotiek, ktorým budeme deliť pôvodné čísla, keď užívateľ vyberie túto možnosť.

Takúto tabuľku nazveme “Možnosti na výber”, naimportujeme ju do dátového modelu, a skontrolujeme, či je neprepojená na ostatné tabuľky. Ak by sa náhodou prepojila s ostatnými tabuľkami, tak všetky prepojenia na túto tabuľku zmažte. Tabuľka musí zostať odpojená od ostatných tabuliek v dátovom modeli. Budeme z nej vyrábať odpojený slicer.

V ďalšom kroku vyrobíme v reporte slicer z tejto novej tabuľky, konkrétne zo stĺpca “Jednotky”. Sliceru nastavíme aby sa zobrazoval ako tlačítka, a zároveň nastavíme stĺpcu “Jednotky”, aby sa jeho položky zobrazovali vo vizualizáciách v poradí podľa stĺpca “Poradie”. Výsledný slicer, napríklad v Power BI, by mal vyzerať takto:

Potom už len vyrobíme merítko, ktoré sa vo vizualizáciách použije namiesto pôvodného merítka “Obrat”, a ktoré bude robiť automatický prepočet jednotiek podľa toho, ktorú možnosť vybral užívateľ v sliceri. Vytvoríme teda takéto merítko:

Obrat dynamicky := IF(HASONEFILTER('Možnosti na výber'[Jednotky]), 
                      [Obrat] / SELECTEDVALUE('Možnosti na výber'[Koeficient]))

Poznámka: v starších verziách PowerPivotu a SSAS Tabularu nahraďte funkciu SELECTEDVALUE funkciou MAX.

Potom už len vymeníme merítko “Obrat” v kontingenčke za merítko “Obrat dynamicky”, a máme to hotové. Keď v sliceri nevyberieme žiadnu možnosť, tak to nezobrazí nič:

Keď však vyberieme možnosť “pôvodné”, tak to zobrazí pôvodnú kontingenčku s pôvodnými jednotkami:

A keď vyberieme možnosť napríklad “milióny”, tak to zobrazí čísla v kontingenčke v miliónoch:

Poznámka: ak používate grafy v Power BI, tak Power BI v označeniach údajov (tzn. popiskoch stĺpcov či bodov grafu) môže používať vlastný automatický prepočet zobrazovaných jednotiek. V tom prípade pohľadajte v nastaveniach vizuálu nastavenie nazvané “Zobrazované jednotky”, resp. “Display units”, a zmeňte ho na možnosť “Žiadne”, resp. “None”. Tak sa to bude zobrazovať správne aj v grafoch Power BI.

Poznámka #2: v Power BI aj SSAS Tabulare/AAS viete nastaviť aj vlastné formátovanie hodnôt, aby sa napríklad tie hodnoty v miliónoch nezobrazovali ako “2,63 €”, ale “2,63 mil. €”. Tomu sa však budeme venovať niekedy inokedy.

Je tam zároveň ošetrená aj možnosť, ak by užívateľ vybral viacero možností naraz v sliceri, pre prípad, že nie ste v Power BI, kde sa dá takéto niečo zakázať. V tomto prípade to užívateľovi nezobrazí nič.

Ak by ste však chceli dať užívateľovi možnosť, aby si vedel zobraziť tie čísla vo viacerých jednotkách súčasne, tak môžete dať do kontingenčky, do oblasti stĺpcov, stĺpec “Jednotky”, ktorý ste použili na vytvorenie sliceru. Keď potom užívateľ vyberie viacero možností v sliceri, tak vybrané možnosti sa mu zobrazia naraz vedľa seba v stĺpcoch kontingenčky:

V prípade grafov Power BI dajte ten stĺpec do oblasti “Legenda”, alebo do obdobnej časti vizuálu. V oboch prípadoch je vhodné ešte vypnúť zobrazovanie stĺpca “Celkovo” v nastaveniach medzisúčtov kontingenčky, pretože tento stĺpec bude vždy prázdny, a aj keby nebol, tak nemá zmysel spočítavať takéto čísla dohromady.

Takýmto spôsobom viete užívateľovi nielen poskytnúť možnosť dynamickej zmeny zobrazovacích jednotiek, ale aj zobraziť to isté číslo vo viacerých jednotkách súčasne.

Táto technika má však jednu nevýhodu. Keď to chcete implementovať pre viacero merítok, napr. aj pre “Náklady” či “Zisk”, tak musíte pre každé z nich vytvoriť merítko so vzorcom uvedeným vyššie, kde v tom vzorci vymeníte “Obrat” za to vaše merítko. Ak ste v excelovskom PowerPivote či SSAS Tabulare pre verziou 2019, tak inú možnosť veľmi nemáte. Ak ste však v Power BI, Azure Analysis Services či SSAS Tabulare od verzie 2019 ďalej, tak sa to dá spraviť elegantnejšie, ako si hneď teraz ukážeme v druhom riešení.

Dynamická zmena zobrazovacích jednotiek cez výpočtové skupiny

Druhé riešenie je možné implementovať cez výpočtové skupiny, ktoré sú dostupné v Power BI od roku 2019, a v SSAS Tabulare od verzie 2019. Táto funkcionalita je jednou z najpokročilejších v dátovom modeli a súčasne jazyku DAX, preto si tu riešenie uvedieme iba stručne.

Začneme opäť s kontingenčkou uvedenou na začiatku článku. Potom do dátového modelu pridáme novú výpočtovú skupinu s názvom “Možnosti na výber”, a výpočtový stĺpec v nej pomenujeme ako “Jednotky”. Potom do nej pridáme 4 výpočtové položky s názvami “pôvodné”, “tisíce”, “milióny” a “miliardy”, ktoré budú v Tabular Editore vyzerať napríklad takto:

Potom nastavíme tieto vlastnosti jednotlivým výpočtovým položkám:

Názov položky Expression Ordinal Format String Expression
pôvodné SELECTEDMEASURE() 0 “#,0.00 “”€”””
tisíce SELECTEDMEASURE() / 1000 1 “#,0.00 “”tis. €”””
milióny SELECTEDMEASURE() / 1e6 2 “#,0.00 “”mil. €”””
miliardy SELECTEDMEASURE() / 1e9 3 “#,0.00 “”mld. €”””

Po uložení týchto nastavení do dátového modelu je už zvyšok postupu jednoduchý. Táto výpočtová skupina sa v dátovom modeli tvári ako nová tabuľka s názvom “Možnosti na výber” so stĺpcom “Jednotky”. Preto, podobne ako v predchádzajúcom riešení, vytvoríme slicer z tohto stĺpca, a zároveň sliceru nastavíme aby sa zobrazoval ako tlačítka.

A to je VŠETKO čo potrebujeme spraviť. V kontingenčke nemusíme nič meniť. Keď teraz vyberieme možnosť “pôvodné”, tak sa nám zobrazí kontingenčka v pôvodných jednotkách:

A keď vyberieme napr. možnosť “milióny”, tak sa zobrazí nielen že v miliónoch, ale čísla budú aj naformátované do formátu “XXX,XX mil. €”:

Je to kvôli tomu, že sme v nastaveniach výpočtových položiek nastavili formátovací reťazec vo vlastnosti “Format String Expression”, a preto Power BI vie prebrať toto formátovanie a zobraziť výsledky naformátované podľa nášho želania.

Najlepšie na tom je to, že to bude fungovať pre všetky merítka, a nemusíme pre každé merítko vyrábať jeho dynamicky zobrazovanú verziu. Teraz stačí jednoducho pridať do kontingenčky ďalšie merítka, napr. “Náklady” a “Zisk”, a bude ich tiež zobrazovať v miliónoch, resp. vo zvolených jednotkách:

A samozrejme, keby ste chceli zobraziť tie čísla vo viacerých jednotkách súčasne, tak to spravíte podobne ako pri prvom riešení. Dajte do kontingenčky, do oblasti stĺpcov, stĺpec “Jednotky”, ktorý ste použili na vytvorenie sliceru. Keď potom užívateľ vyberie viacero možností v sliceri, tak vybrané možnosti sa mu zobrazia naraz vedľa seba v stĺpcoch kontingenčky:

Táto funkcionalita je však podstatne náročnejšia na pochopenie v porovnaní s prvým riešením. Táto funkcionalita zároveň funguje iba vtedy, keď máte v kontingenčke v oblasti “Hodnoty” použité merítka. Ak tam máte použitý zosumarizovaný stĺpec, tak to nebude fungovať, a musíte pre neho spraviť merítko. Je to kvôli tomu, ako fungujú výpočtové skupiny.

Keď kliknete na danú položku v sliceri, tak to aplikuje filter na celú stranu reportu. Tá položka v sliceri v skutočnosti reprezentuje výpočtovú položku, a preto to v skutočnosti aplikuje tzv. “výpočtový filter”, ktorý sa na prvý pohľad správa ako iné filtre, ale v skutočnosti nič nefiltruje. Funguje tak, že sa po jednom aplikuje na všetky bunky kontingenčky, kde je použité nejaké merítko. Následne pri výpočte tej bunky nahradí vzorec merítka v tej bunke vzorcom danej výpočtovej položky, a s tým vzorcom vypočíta výsledok v tej bunke. Zoberme si napríklad túto verziu reportu, kde sme v sliceri vybrali možnosť “milióny”, a v ktorom si ako vzorovú bunku vyberieme bunku so Ziskom za rok 2003:

Za normálnych okolností by sa na výpočet takejto bunky použil vzorec merítka “Zisk”. Na všetky bunky kontingenčky je však aplikovaný hore uvedený výpočtový filter, a preto sa odkaz na merítko “Zisk” v tejto bunke nahradí vzorcom vybranej výpočtovej položky, čiže vzorcom “SELECTEDMEASURE() / 1e6”. Funkcia SELECTEDMEASURE vracia odkaz na merítko, ktoré sa práve počíta v tej bunke, resp. ktoré tam bolo pred tým nahradením. Čiže vo výsledku to pre tú bunku zavolá vzorec “[Zisk] / 1e6”, čo predelí hodnotu Zisku pre tú bunku 1 miliónom. Zároveň je pre danú výpočtovú položku nastavený formátovací reťazec, pomocou ktorého sa naformátuje výsledná hodnota pre zobrazovanie v kontingenčkách a grafoch. Vo vzorcoch jazyka DAX však stále bude vystupovať táto hodnota ako číslo, takže s ňou môžete vykonávať ďalšie výpočty ako obvykle.

Výhoda tohto riešenia je to, že nemusíte pre každé pôvodné merítko vytvárať jeho dynamickú verziu. Funguje to pre všetky merítka automaticky. Takisto tabuľku pre odpojený slicer nahradzuje výpočtová skupina, ktorá sa tvári ako tabuľka s 1 stĺpcom. Toto riešenie je možné kombinovať aj s rôznymi merítkami v rôznych jednotkách, napríklad ak máte merítka ako “Zisk” (zobrazované v pôvodných hodnotách) a “Marža” (zobrazované v percentách). Stačí použiť funkcie pre prácu s výpočtovými skupinami, ako napríklad SELECTEDMEASURENAME alebo SELECTEDMEASUREFORMATSTRING, a aj takéto požiadavky sa dajú implementovať ľavou zadnou. Takto sa dá implementovať dynamická zmena zobrazovaných jednotiek elegantnejšie, bez potreby duplikovania vzorcov v dátovom modeli, hromadne pre všetky merítka naraz. Len je potrebné dobre pochopiť a následne použiť funkcionalitu výpočtových skupín, ako sa učí napríklad na našom pokročilom kurze Power BI.

Na záver

Dynamická zmena zobrazovaných jednotiek v Power BI či PowerPivote nemusí byť strašiakom. Po troche znalostí sa dá implementovať celkom jednoducho, ako ste videli na príkladoch vyššie. Takto sa vám bude dať implementovať nielen dynamická zmena zobrazovaných jednotiek, ale aj iná dynamická funkcionalita v Power BI a iných reportovacích nástrojoch ľavou zadnou 🙂