Jedním ze základních výpočtů při práci s daty v Power BI, v Excelu nebo v SSAS Tabulárním modelu je výpočet procentuálních podílů. Tento článek popisuje dva přístupy k výpočtu procentuálních podílů. V prvním příkladu si ukážeme výpočet procentuálních podílů s použitím funkcí CALCULATE() a REMOVEFITERS(). V druhém příkladu použijeme funkci CALCULATE() v kombinaci s funkcí ALLSELECTED() a ukážeme si rozdíly mezi těmito dvěma přístupy.
Výpočet procentuálních podílů v jazyku DAX a Power BI
V příkladech budeme pracovat se cvičným souborem Contoso Sales Sample for Power BI Desktop.pbix, který je volně dostupný ke stažení na internetu. Soubor s příklady z tohoto příspěvku je dostupný ke stažení pod tímto příspěvkem.
V první částí si ukážeme výpočet procentuálního podílu s funkcí REMOVEFILTERS(). Následovat bude výpočet procentuálních podílů s funkcí ALLSELECTED(), včetně zobrazení mezi výpočtů pro dělence a dělitele.
Ve všech příkladech budeme pracovat s měřítkem [Prodeje], které bude počítat sumu za prodané produkty v aktuálním kontextu vyhodnocení.
Měřítko:
Měřítko [Prodeje] bude vracet sumu za prodané produkty v aktuálním kontextu vyhodnocení. V Power BI reportu si můžeme vytvořit jednoduchý vizuál Tabulky s kategoriemi produktů v řádcích, a s novým měřítkem [Prodeje] v hodnotách.
V řádcích tabulky jsou kategorie produktů. Měřítko [Prodeje] je vyhodnoceno v kontextu filtru každé kategorie. Pokud bychom chtěli vypočítat procentuální podíl aktuálních prodejů k celkovým prodejům, musíme v děliteli upravit kontext filtru tak, aby obsahoval sumu prodejů za všechny kategorie.
Výpočet procentuálního podílu s REMOVEFILTERS
Měřítko:
Nové měřítko můžeme přidat do dříve vytvořeného vizuálu, spolu s původním měřítkem [Prodeje] a hodnotami ze sloupce 'ProductCategory'[ProductCategory] v řádcích tabulky.
Na obrázku výše můžeme vidět, že výsledek nového měřítka [Dělitel REMOVEFILTERS()] opravdu vrací v každém řádku tabulky sumu prodejů za všechny kategorie. Tuto hodnotu tedy můžeme použít jako dělitele pro výpočet procentuálního podílu prodejů v jednotlivých kategoriích. Takovýto výpočet v jednom měřítku může vypadat následovně.
Měřítko:
Pro výpočet podílu je použita funkce DIVIDE(), která automaticky ošetřuje dělení nulou. Prvním argumentem funkce DIVIDE() je měřítko [Prodeje], které vrací hodnotu prodejů v aktuálním kontextu vyhodnocení. Dělitel v druhém argumentu funkce DIVIDE() obsahuje stejný výpočet, který jsme použili dříve pro definici měřítka [Dělitel REMOVEFILTERS()]. Výsledek si můžeme zobrazit v dříve vytvořeném vizuálu.
Měřítko [% Prodeje REMOVEFILTERS()] vrací procentuální podíl prodejů v dané kategorii vztažený ke všem prodejům ve všech kategoriích. Takto definované měřítko odstraní v dělitely filtry ze sloupce s kategoriemi produktů i v případě, že tento sloupec použijeme v průřezu.
Pokud v průřezu vybereme pouze některé kategorie, dělitel v měřítku [% Prodeje REMOVEFILTERS()] na tento filtr nereaguje, protože odstraní všechny filtry ze sloupce použitého jako argument funkce REMOVEFILTERS(), tedy i filtry z průřezu. Výsledkem měřítka je tedy procentuální podíl prodejů v dané kategorii k celkovým prodejům ve všech kategoriích. Pokud bychom chtěli jako dělitele použít pouze sumu prodejů za kategorie vybrané v průřezu, musíme použít funkci ALLSELECTED(), namísto funkce REMOVEFILTERS().
Výpočet procentuálního podílu s ALLSELECTED
Měřítka:
Pokud nepoužijeme filtr v průřezu, výsledek obou měřítek s výpočtem dělitele je stejný a představuje sumu prodejů za všechny kategorie.
Pokud ovšem použijeme filtr na určité kategorie produktů v průřezu, výsledky obou dělitelů jsou již jiné.
Pokud jako dělitele použijeme výpočet s funkcí ALLSELECTED() s argumentem ve formě sloupce s kategoriemi produktů, pak bude dělitele obsahovat sumu prodejů za všechny produkty v kategoriích vybraných v průřezu. Při výpočtu tedy dojde pouze k odstranění filtrů z řádků tabulky, ale vnější filtry z průřezu jsou zachovány. Definice měřítka s výpočtem procentuálního podílu s použitím funkce ALLSELECTED() pak může vypadat následovně.
Měřítko:
Nové měřítko si můžeme vložit do vizuálu tabulky spolu měřítkem [Prodeje] a původním výpočtem procentuálních prodejů s použitím funkce REMOVEFILTERS().
Výpočet procentuálního podílu v kombinaci s funkcí REMOVEFILTERS() vrací vždy podíl prodejů v jednotlivých kategoriích na celkových prodejích, bez ohledu na filtr přicházející z průřezu. Výpočet podílu v kombinaci s funkcí ALLSELECTED() vrací podíl prodejů v jednotlivých kategoriích, vztažený k sumě prodejů ve všech kategoriích vybraných v průřezu. Pokud odstraníme filtr z průřezu, výsledek obou výpočtů bude stejný.
Při výpočtu dělitele s funkcí ALLSELECTED() tedy používáme jako dělitele sumu za kategorie vybrané v průřezu. V jiných typech reportů může vnější filtr přicházet z jiných vizuálů a nemusí se jednat pouze o průřezy. Pokud na sloupec, který použijeme jako argument funkce ALLSELECTED(), není aplikován žádný vnější filtr, výpočet procentuálního podílu s funkcí ALLSELECTED() vrací stejné výsledky jako výpočet procentuálního podílu s použitím funkce REMOVEFILTERS().
Funkci ALLSELECTED() bychom neměli používat přímo v iteračních funkcích. Podrobnější popis chování funkce ALLSELECTED() můžete najít v samostatném příspěvku.
Další informace o funkcích použitých v tomto článku jsou k dispozici na stránce Jazyk DAX. Praktické příklady pak můžete najít na stránce DAX příklady.
V jednoduchém příkladu v tomto příspěvku bylo možné vidět rozdíl mezi výpočtem procentuálního podílu s použitím funkce REMOVEFILTERS() a ALLSELECTED(). Funkce ALLSELECTED() a REMOVEFILTERS() jsme používali s argumentem ve formě odkazu na sloupec s kategoriemi produktů. Tyto funkce však můžeme použít také s argumenty ve formě tabulek, nebo bez argumentu. Při vytváření podobných výpočtů proto musíme vždy pečlivě zvažovat, které filtry chceme odstranit a které naopak zachovat. Dále musíme uvažovat v kontextu vyhodnocení měřítek. Musíme tedy brát v úvahu filtry uvnitř vizuálu a také případné vnější filtry působící na výpočet z jiných vizuálů. Pokud si u komplexnějších výpočtů nejsme jisti, jaké hodnoty vrací jednotlivé dílčí výpočty uvnitř měřítka, je vždy dobré zobrazit si tyto dílčí výpočty samostatně, stejně jako jsme si výpočty jednotlivých dělitelů zobrazovali v příkladech uvedených v tomto příspěvku.
Komentáře
Okomentovat