Procentuální podíl v jazyku DAX a Power BI

Úvodní obrázek

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:

Prodeje =
SUMX
(
Sales,
Sales[UnitPrice] * Sales[SalesQuantity]
)

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ýpočet procentuálního podílu v jazyku DAX

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

Při výpočtu dělitele budeme chtít odstranit filtry pocházející z řádků tabulky. K tomu můžeme použít funkci REMOVEFILTERS(), s argumentem ve formě sloupce použitého v řádcích vizuálu. Definice dělitele s použitím funkce REMOVEFILTERS() může vypadat následovně.

Měřítko:

Dělitel REMOVEFILTERS() =
CALCULATE
(
[Prodeje],
REMOVEFILTERS(ProductCategory[ProductCategory])
)

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.

Výpočet procentuálního podílu v jazyku DAX 2

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:

% Prodeje REMOVEFILTERS() =
DIVIDE
(
[Prodeje],
CALCULATE
(
[Prodeje],
REMOVEFILTERS(ProductCategory[ProductCategory])
)
)

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.

Výpočet procentuálního podílu v jazyku DAX 3

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.

Výpočet procentuálního podílu v jazyku DAX 4

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

Pro znázornění rozdílu mezi použitím funkce REMOVEFILTERS() a funkce ALLSELECTED() pro úpravu filtrů ve funkci CALCULATE() si zobrazíme výpočet dělitele oběma způsoby. Definice dělitele z funkcí REMOVEFILTERS() již máme v modelu k dispozici. Stejným způsobem si vytvoříme pro ilustraci výpočet dělitele s použitím funkce ALLSELECTED().

Měřítka:

Dělitel REMOVEFILTERS() =
CALCULATE
(
[Prodeje],
REMOVEFILTERS(ProductCategory[ProductCategory])
)
Dělitel ALLSELECTED() =
CALCULATE
(
[Prodeje],
ALLSELECTED(ProductCategory[ProductCategory])
)

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.

Výpočet procentuálního podílu v jazyku DAX 5

Pokud ovšem použijeme filtr na určité kategorie produktů v průřezu, výsledky obou dělitelů jsou již jiné.

Výpočet procentuálního podílu v jazyku DAX 6

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:

% Prodeje ALLSELECTED() =
DIVIDE
(
[Prodeje],
CALCULATE
(
[Prodeje],
ALLSELECTED(ProductCategory[ProductCategory])
)
)

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 jazyku DAX 7

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ý.

Výpočet procentuálního podílu v jazyku DAX 8

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.

Shrnutí

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.

č. 8

Komentáře