Nahrazení hodnoty BLANK nulou v jazyku DAX a Power BI

Nahrazení hodnoty BLANK nulou v jazyku DAX a PowerBI

Typickou vlastností Power BI vizuálů je automatické odfiltrování řádků, pro které vrací měřítka prázdné hodnoty BLANK. V tomto příspěvku si vysvětlíme, proč tomu tak je a proč je toto defaultní chování vizuálů ve většině případů užitečné. Na druhou stranu ale mohou existovat také situace, kdy samotný fakt že k určité události nedošlo má analytickou hodnotu. V těchto případech pak můžeme nahradit prázdnou hodnotu BLANK číslovkou nula, a tím dosáhnout zobrazení také těch položek ve vizuálu, které by jinak byly skryté.

K tomuto tématu je k dispozici také video:

V první části příspěvku si ukážeme několik možností, jak nahradit prázdné hodnoty BLANK číslovkou nula. Nahrazení BLANK hodnotu nulou ale může mít za určitých okolností také negativní dopad jak na výkon, tak na přehlednost reportů, jak si vysvětlíme ve druhé části. Proto si ještě na závěr ukážeme postup, jak vytvořit report ve kterém si může uživatel sám zvolit, zda v aktuálním zobrazení chce nahradit prázdné hodnoty BLANK nulou a zobrazovat tak položky, které by v defaultním nastavení byly skryté.

Všechny příklady v tomto příspěvku jsou vytvořeny ve cvičném Power BI souboru Adventure Works DW 2020.pbix, který je pro účely použitých příkladů mírně upravený. Soubor s řešením je dostupný ke stažení níže pod tímto příspěvkem.

Začít můžeme přípravou prostředí. V prvním kroku si v použitém Power BI souboru vytvoříme tři jednoduchá měřítka, měřítko [Prodeje], měřítko [Náklady] a měřítko [Množství].

Měřítka:

Prodeje = SUM(Sales[Sales Amount])

Náklady = SUM(Sales[Total Product Cost])

Množství = SUM(Sales[Order Quantity])

Nová měřítka jednoduše sčítají hodnoty ze sloupců z faktové tabulky 'Sales'. Pokud si vložíme například měřítko [Prodeje] do vizuálu Matice, spolu s roky a kategoriemi produktů v řádcích, výsledek bude vypadat následovně.

Nahrazení hodnoty BLANK nulou v jazyku DAX a PowerBI 2

Jak můžeme vidět na obrázku výše, tak pro rok 2018 a pro rok 2020 vidíme v řádcích čtyři kategorie produktů, kategorie "Accessories", "Bikes", "Clothing" a "Components". V roce 2019 ale vidíme v řádcích pouze tři kategorie produktů. V tomto roce chybí kategorie "Bikes". Důvod, proč nevidíme v roce 2019 kategorii "Bikes" spočívá v tom, že pro tento rok a tuto kategorii nemáme ve faktové tabulce 'Sales' žádný záznam. Jinak řečeno v roce 2019 se neprodal jediný produkt v kategorii "Bikes". Měřítko [Prodeje] proto v buňce ve které je nastavený filtr na rok 2019 a na kategorii "Bikes" vrací hodnotu BLANK, a vizuál Matice, stejně jako kterýkoliv jiný vizuál, v defaultním nastavení nezobrazuje položky, pro které vrací měřítka prázdné hodnoty BLANK.

Proč tomu tak je a proč je toto chování ve většině situacích prospěšně si vysvětlíme později. Než se ale k tomuto vysvětlení dostaneme, můžeme si ukázat několik způsobů, jak zobrazovat místo hodnoty BLANK číslo 0. Díky tomu již budeme vidět v řádcích vizuálu všechny kategorie i v roce 2019, protože číslovka 0 je hodnota jak kterákoliv jiná a nedojde k jejímu automatickému odfiltrování. Současně hodnota 0 zobrazená u některé z kategorií jasně říká, že produkty v dané kategorii se v určitém období vůbec neprodávaly, což má samo o sobě také informační charakter.

Nahrazení prázdné hodnoty BLANK nulou

Způsobů, jak v jazyku DAX nahradit prázdnou hodnotu BLANK číslem 0 je celá řada. Zřejmě nejrozšířenější postup pak spočívá v použití funkce IF(), kdy jednoduše v prvním argumentu této funkce ověříme, zda měřítko [Prodeje] vrací hodnotu BLANK. Pokud ano, vypíšeme místo hodnoty BLANK číslo 0. Pokud měřítko [Prodeje] vrací jakoukoliv jinou hodnotu než je hodnota BLANK, vypíšeme samotnou hodnotu měřítka [Prodeje].

Měřítko:

Prodeje (IF) =
IF
(
    [Prodeje] = BLANK(),
    0,
    [Prodeje]
)

Novou verzi měřítka [Prodeje] si můžeme vložit do původního vizuálu Matice a zobrazit si výsledky.

Nahrazení hodnoty BLANK nulou v jazyku DAX a PowerBI 3

Jak je možné vidět na obrázku výše, kategorie "Bikes" již je pro rok 2019 k dispozici. Tento řádek se pak ve vizuálu objevil proto, že nové měřítko [Prodeje (IF)] již vrací pro tuto kategorii v daném roce číslo 0 namísto hodnoty BLANK.

Další možností pro dosažení stejného výsledku může být použití funkce COALESCE(). Funkce COALESCE() je logická funkce, která ze všech zadaných výrazů nebo zadaných hodnot vrátí první která není BLANK. Pokud tedy do prvního argumentu této funkce vložíme měřítko [Prodeje], a do druhého argumentu číslo 0, výsledkem funkce COALESCE() bude hodnota měřítka [Prodeje] v případě že toto měřítko nebude vracet prázdnou hodnotu BLANK, a číslo nula v případě že měřítko [Prodeje] bude vracet prázdnou hodnotu BLANK.

Měřítko:

Prodeje (COALESCE) = COALESCE([Prodeje], 0)

Měřítko [Prodeje (COALESCE)] vrací stejné výsledky jako měřítko [Prodeje (IF)].

Nahrazení hodnoty BLANK nulou v jazyku DAX a PowerBI 4

Další, zřejmě nejjednodušší způsob jak dosáhnout stejného efektu je k samotnému výpočtu přičíst číslo 0. Zde budeme vycházet z faktu, že pokud v jazyku DAX přičteme k hodnotě BLANK číslo 0, výsledkem bude číslo 0. Pokud bude měřítko [Prodeje] vracet jakoukoliv hodnotu, přičtením číslovky 0 tuto hodnotu nezměníme. Pokud ale bude měřítko [Prodeje] vracet prázdnou hodnotu BLANK, přičtením čísla 0 k prázdné hodnotě BLANK dostaneme číslo 0.

Měřítko:

Prodeje (přičtení nuly) = [Prodeje] + 0

Výsledky nového měřítka můžeme vidět na následujícím obrázku.

Nahrazení hodnoty BLANK nulou v jazyku DAX a PowerBI 5

Všechna tři měřítka, tedy měřítka [Prodeje (IF)], [Prodeje (COALESCE)] a [Prodeje (přičtení nuly)] budou za všech okolností vracet stejné výsledky. Preferovanou variantou by pak mělo být použití funkce COLAESCE() nebo jednoduché přičtení číslovky 0, protože tyto dvě varianty generují nepatrně jednodušší Query Plan v porovnání s použitím funkce IF().

Ačkoliv nahrazení prázdné hodnoty BLANK číslem nula není nic složitého, neměli bychom být při tomto postupu lehkovážní. Každé měřítko by totiž mělo být ze své podstaty univerzálně použitelné v různých kontextech, a automatickým nahrazováním BLANK hodnot nulou si můžeme způsobit více problémů než užitku, jak si ukážeme v následující části příspěvku.

Význam hodnoty BLANK v Power BI vizuálech

Jak už jsme si několikrát řekli, pokud měřítka vrací pro určitý řádek vizuálu hodnotu BLANK, tyto řádky jsou v defaultním nastavení automaticky odfiltrovány a nedochází k jejich zobrazení. Na základě předchozího příkladu s kategoriemi produktů se může zdát, že toto defaultní chování není úplně ideální. V následující části příspěvku si proto ukážeme několik vizuálů, na základě kterých bude zřejmé, že tato vlastnost je naopak pro práci s reporty velmi důležitá.

Uvažujme například vizuál Skupinový sloupcový graf. Pokud na osu X vložíme hodnoty ze sloupce 'Date'[Měsíc rok] a do hodnot měřítko [Prodeje (přičtení nuly)], výsledek může vypadat následovně.

Nahrazení hodnoty BLANK nulou v jazyku DAX a PowerBI 6

Pro porovnání si pak vložíme do stejného vizuálu měřítko [Prodeje], které neobsahuje dodatečnou logiku pro nahrazení prázdných BLANK hodnot nulou.

Nahrazení hodnoty BLANK nulou v jazyku DAX a PowerBI 7

Porovnáním dvou výše zobrazených vizuálů je zřejmé, že nahrazení prázdné hodnoty BLANK nulou může být kontraproduktivní. Měřítko [Prodeje (přičtení nuly)] totiž vrací hodnotu 0 také pro měsíce, ve kterých ještě nedošlo k žádným prodejům, a dále také pro měsíce, pro které ještě nemáme k dispozici data. Jedná se o měsíce na začátku roku 2018 a na konci roku 2020. Tyto měsíce, ve kterých vrací měřítko [Prodeje (přičtení nuly)] hodnotu nula jsou měsíce, které musejí být v datumové tabulce z důvodu správného fungovaní Time intelligence funkcí, jak je popsáno v samostatném příspěvku.

Měřítko [Prodeje (přičtení nuly)] ale může generovat ještě daleko výraznější problémy. Pokud například vložíme do řádků vizuálu Matice měsíce z tabulky 'Date' a dále jména zákazníků z tabulky 'Customer', výsledek bude vypadat následovně.

Nahrazení hodnoty BLANK nulou v jazyku DAX a PowerBI 8

Vizuál Matice nyní zobrazuje 36 měsíců, a v každém měsíci 18 401 zákazníků. Protože měřítko [Prodeje (přičtení nuly)] vrací pro každou kombinaci hodnoty použitých v řádcích vizuálu neprázdnou hodnotu, to znamená buď číslo 0 nebo hodnotu prodejů, DAX engine musí před zobrazení výsledků zpracovat všechny kombinace hodnot ze sloupců 'Date'[Měsíc rok] a 'Customer'[Zákazník]. Jedná se tedy o 662 436 řádků, které musí DAX engine zpracovat před zobrazením části výsledků ve vizuálu. Dále, pokud bychom chtěli v takto vytvořeném vizuálu najít konkrétního zákazníka v jednom konkrétním měsíci, máme problém, protože musíme v každém měsíci hledat mezi všemi 18 401 zákazníky, kdy většina zákazníků vůbec v daném měsíci nenakupovala.

Pokud bychom použili ve stejném vizuálu Matice měřítko [Prodeje] namísto měřítka [Prodeje (přičtení nuly)], DAX engine automaticky odfiltruje ty zákazníky, kteří v daném měsíci nenakupovali. Výsledkem bude daleko přehlednější vizuál a výrazně lepší výkon. Důvodem pro rychlejší vyhodnocení vizuálu při použití měřítka [Prodeje] je že DAX engine již nemusí pracovat s 662 436 řádkovou tabulkou, ale pouze s tabulkou s 23 081 řádky, což je počet kombinací hodnot ze sloupců 'Date'[Měsíc rok] a 'Customer'[Zákazník] pro které existuje záznam ve faktové tabulce 'Sales'.

Automatické filtrování vizuálů pouze na hodnoty které nejsou BLANK má svůj význam. Jak z pohledu výkonosti, tak z pohledu přehlednosti není ideálním řešením všechny prázdné hodnoty nahrazovat číslem 0. Pokud bychom přesto chtěli v určitých specifických situacích nahradit prázdné hodnoty číslem nula, můžeme pro tento účel buď vytvořit speciální měřítko, nebo vytvořit Kalkulační skupinu (Calculation Group) a aplikovat logiku s nahrazení prázdné hodnoty pouze pro určité vizuály pomocí Kalkulační položky (Calculation Item), jak si ukážeme v následující části příspěvku.

Nahrazení prázdných BLANK hodnot nulou pomocí Kalkulační skupiny

Vytvořit Kalkulační skupinu (originální anglický název je Calculation Group) v Power BI můžeme buď pomocí některého z externích nástrojů, jako je například Tabular Editor, nebo přímo v Power BI v Průzkumníku modelu.

V době psaní tohoto příspěvku je Průzkumník modelu v Power BI dostupný pouze v Preview verzi. Zapnout tuto funkcionalitu můžeme v nastavení, jak je znázorněno na následujícím obrázku.

Nahrazení hodnoty BLANK nulou v jazyku DAX a PowerBI 9

Pokud se následně přepneme Power BI navigaci na kartu "Zobrazení modelu", můžeme v postranním modelu vytvořit novou "Kalkulační skupinu".

Důležité: Kalkulační skupinu nevytvářejte v modelu, ve kterém používáte implicitní měřítka. Implicitní měřítka jsou automaticky vytvořená měřítka, která vzniknou pokud vložíme do hodnot vizuálů přímo sloupec, nad kterým vznikne automaticky jakýkoliv druh agregace. Po vytvoření Kalkulační skupiny přestanou tato implicitní měřítka fungovat. Pokud si nejste jistí, zda máte v Power BI souboru použita implicitní měřítka, vždy si před vytvořením první Kalkulační skupiny udělejte zálohu souboru, abyste případně nepřišli o rozdělanou práci!

Nahrazení hodnoty BLANK nulou v jazyku DAX a PowerBI 10

Následně můžeme zvolit vhodný název pro Kalkulační skupinu a sloupec s jednotlivými položkami, a vytvořit si dvě nové kalkulační položky.

Nahrazení hodnoty BLANK nulou v jazyku DAX a PowerBI 11

Název Kalkulační skupiny (Způsob zobrazení) bude v modelu představovat název tabulky. Druhý název (0 místo BLANK) představuje název sloupce v této tabulce. Ve sloupci 'Způsob zobrazení'[0 místo BLANK] pak budou uloženy jednotlivé Kalkulační položky, které budou mít v našem příkladu následující definici.

Kalkulační položky:

Nahradit = SELECTEDMEASURE() + 0

Nenahrazovat = SELECTEDMEASURE()

Funkce SELECTEDMEASURE() je funkce která je v případě aplikování Kalkulační položky nahrazena jakýmkoliv měřítkem, které je vyhodnoceno v kontextu filtru dané Kalkulační položky. 

Pokud vložíme sloupec 'Způsob zobrazení'[0 místo BLANK] z nově vytvořené Kalkulační skupiny například do vizuálu Průřez, a v tomto průřezu vybereme Kalkulační položku "Nahradit", výsledek bude vypadat následovně.

Nahrazení hodnoty BLANK nulou v jazyku DAX a PowerBI 12

Pokud vybereme v Průřezu možnost "Nenahrazovat", případně pokud nevybereme žádnou položku v Průřezu, výsledkem bude report, ve kterém nebudeme nahrazovat prázdné hodnoty BLANK číslem nula.

Nahrazení hodnoty BLANK nulou v jazyku DAX a PowerBI 13

Díky nově vytvořené Kalkulační skupině si tak uživatel reportů může sám zvolit, zda chce v aktuálním zobrazení nahrazovat prázdné hodnoty BLANK číslem nula. Autor reportů je ale stále zodpovědný za to, ve kterém reportu umožní uživatelům použití nově vytvořené Kalkulační skupiny. Tato možnost by měla být k dispozici pouze v reportech, ve kterých máme jistotu že nahrazením prázdných BLANK číslem nula nevznikne problém s načítáním vizuálů.

Podobně bychom mohli použít Kalkulační skupinu pouze pro jeden nebo více konkrétních vizuálů tak, že bychom jednu Kalkulační položku vybrali přímo v postranním panelu Filtry buď pro konkrétní vizuál nebo pro určitou stránku.

Nahrazení hodnoty BLANK nulou v jazyku DAX a PowerBI 14

Díky tomuto přístupu tak můžeme omezit počet měřítek v modelu v případě, kdy chceme v některých konkrétních vizuálech nahrazovat prázdné hodnoty BLANK číslem nula, zatímco v jiných vizuálech tuto logiku aplikovat nechceme.

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

Komentáře