Nefunkční RANKX v Power BI

Úvodní obrázek

Funkce RANKX() je jedna ze složitějších funkcí v jazyku DAX, především z důvodu způsobu vyhodnocení jednotlivých argumentů. Pokud funkce RANKX() nevrací očekáváné výsledky v Power BI reportech, v Power Pivot v Excelu nebo v jiných nástrojích, obvykle není problém ve funkci samotné, ale ve špatné definici jednotlivých argumentů. Tento článek obsahuje některé časté příklady špatného použití funkce RANKX() a způsoby správného řešení. Detailní popis funkce RANKX() je dostupný v samostatném příspěvku.

Příklady nevhodného použití funkce RANKX v Power BI

Příklady v tomto příspěvku jsou vytvořeny ve cvičném Power BI souboru Adventure Works DW 2020.pbix, který je volně dostupný ke stažení na internetu. Odkaz na stažení souboru s řešením můžete najít níže pod tímto příspěvkem. V příkladech bude často používáno měřítko [Prodeje], které má následující definici.

Měřítko:

Prodeje = SUM(Sales[Sales Amount])

Způsob použití funkce RANKX() se liší podle kontextu, ve kterém je výpočet vyhodnocen. Nefunkční výpočet v měřítku může fungovat v počítaném sloupci, a naopak. Z tohoto důvodu je v tomto článku v názvu každého vzorce uvedeno, zda se jedná o výpočet určený pro počítaný sloupec nebo měřítko.

Před uvedením prvního příkladu ještě jedno důležité upozornění. Ve funkci RANKX() bychom neměli používat pro sumarizační výpočty sloupce s hodnotami ve formátu DECIMAL (plovoucí desetinná čárka). Pokud máme v datovém modelu hodnoty ve formátu DECIMAL s plovoucí desetinou čárkou, v oficiální dokumentaci najdeme doporučení používat pro výpočty nad těmito sloupci, v případě práce s funkcí RANKX(), zaokrouhlovací funkci ROUND().

Časté chyby při použití funkce RANKX()

Asi nejčastější příčinou neočekávaných výsledků při použití funkce RANKX() v měřítku je nesprávná definice prvního argumentu. Uvažujme například pořadí jednotlivých produktů podle sumy prodejů. 

Nefunkční funkce RANKX v Power BI

Pokud bychom chtěli vytvořit měřítko, které bude vracet pořadí každého produktu v porovnání se všemi ostatními produkty, v závislosti na sumě prodejů, následující výpočet nebude fungovat.

Měřítko:

(Měřítko) Pořadí produktů podle prodejů ŠPATNĚ =
RANKX
(
    'Product',
    [Prodeje]
)

Problém takto definovaného měřítka je, že tabulka uvedená v prvním argumentu funkce RANKX() je v každém řádku vizuálu filtrována pouze na jeden konkrétní produkt. Výsledek je proto v každém řádku vizuálu Tabulky stejný, protože porovnáváme produkt v aktuálním řádku vizuálu sám se sebou.

Nefunkční funkce RANKX v Power BI 2

Tabulka v prvním argumentu funkce RANKX() by v aktuálním kontextu vyhodnocení měla obsahovat všechny záznamy, které chceme použít pro vytvoření pořadí. Řešením může v tomto případě být vložení tabulky v prvním argumentu funkce RANKX() do některé z ALL* funkcí.

Měřítko:

(Měřítko) Pořadí produktů podle prodejů =
RANKX
(
    ALL('Product'),
    [Prodeje]
)

Jak je vidět na obrázku níže, nově definované měřítko již vrací očekávané výsledky.

Nefunkční funkce RANKX v Power BI 3

Na následujícím obrázku pak můžeme vidět výsledek stejného měřítka, ale použitého v jiném kontextu vyhodnocení. V řádcích vizuálu Tabulka jsou nyní namísto jedinečných identifikátorů každého produktů použity hodnoty ze sloupce 'Product'[Product], který obsahuje názvy produktů.

Nefunkční funkce RANKX v Power BI 4

Měřítko [(Měřítko) Pořadí produktů podle prodejů] vrací pro některé produkty stejné pořadí, i když je suma za prodeje každého produktu jiná. Důvodem je jiná granularita hodnot ve vizuálu a jiná granularita tabulky v prvním argumentu funkce RANKX(). Názvy produktů totiž nejsou v tabulce 'Product' jedinečné. Každý produkt se může vyskytovat v tabulce 'Product' několikrát, pokud se změnil některý z atributů produktu. 

Nefunkční funkce RANKX v Power BI 5

Pokud v řádcích vizuálu používáme název produktu, měli bychom i pořadí určit podle prodejů za všechny verze stejného produktu. Funkční definice měřítka v tomto případě může vypadat následovně.

Měřítko:

(Měřítko) Pořadí produktů podle prodejů správná granularita =
RANKX
(
    ALL('Product'[Product]),
    [Prodeje]
)

Jak je vidět na obrázku níže, nová verze měřítka již vrací očekávané výsledky.

Nefunkční funkce RANKX v Power BI 6

Na předchozí ukázce bylo možné vidět, že měřítko funkční v určitém kontextu nemusí vracet očekávané výsledky, pokud je použito v kontextu jiném, než pro který bylo původně vytvořeno. Proto je mimo jiné dobré ověřit si před vyhodnocením samotného výpočtu také kontext, ve kterém je měřítko použito, což bude předvedeno později v jednom z následujících příkladů.

Dalším problémem použití funkce RAKX() v měřítku může být chybějící třetí argument. Ten je třeba použít mimo jiné v případě, kdy používáme funkci RANKX() v měřítku, a současně chceme ve druhém argumentu funkce použít přímý odkaz na sloupec z tabulky v prvním argumentu. Následující výpočet vyhodnocený v měřítku vrací chybu.

Měřítko:

(Měřítko) Pořadí podle katalogové ceny (Chybí třetí argument) =
RANKX
(
    ALL('Product'),
    'Product'[List Price]
)

Problém s takto definovaným měřítkem nastane, když dojde na vyhodnocení druhého argumentu funkce v originálním kontextu. 

Nefunkční funkce RANKX v Power BI 7

V originálním kontextu vyhodnocení, tedy v kontextu, kde je měřítko použito, není k dispozici žádný kontext řádku, a proto nemůžeme v tomto kontextu přistupovat přímo k hodnotám z jakékoliv tabulky.

Pokud použijeme v druhém argumentu funkce přímý odkaz na sloupec (při použití RANKX() v měřítku), musíme použít i třetí argument funkce, a v něm použít buď měřítko, nebo některou ze sumarizačních funkcí. Následující výpočet již bude v reportu fungovat.

Měřítko:

(Měřítko) Pořadí podle katalogové ceny s třetím argumentem =
RANKX
(
    ALL('Product'),
    'Product'[List Price],
    SUM('Product'[List Price])
)

Výsledek výše uvedeného měřítka můžeme vidět na následujícím obrázku.

Nefunkční funkce RANKX v Power BI 8

Měřítko vytvořené pro vyhodnocení pouze v konkrétním kontextu by nemělo vracet výsledky, pokud uživatel použije měřítko v nesprávném kontextu. Následující výpočet vrací pořadí podkategorií podle sumy prodejů.

Měřítko:

(Měřítko) Pořadí podkategorie podle prodejů =
RANKX
(
    ALL('Product'[Subcategory]),
    [Prodeje]
)

Pokud tento výpočet použijeme v kontextu jednotlivých podkategorií, vše funguje tak jak má.

Nefunkční funkce RANKX v Power BI 9

Pokud ale do řádků vizuálu vložíme hodnoty z jiného sloupce, než hodnoty z tabulky použité v prvním argumentu funkce RANKX(), výsledek měřítka nedává žádný smysl.

Nefunkční funkce RANKX v Power BI 10

Následující měřítko obsahuje ve funkci RANKX() stejný výpočet. Před jeho vyhodnocením ale nejdříve ověříme, zda je měřítko vyhodnoceno v kontextu hodnot ze sloupce 'Product'[Subcategory]. Pokud ano, dojde k vyhodnocení výpočtu ve druhém argumentu funkce IF(). Pokud je měřítko vyhodnoceno v jiném kontextu, výsledkem bude hodnota BLANK.

Měřítko:

(Měřítko) Pořadí podkategorie podle prodejů ISINSCOPE =
IF
(
    ISINSCOPE('Product'[Subcategory]),
    RANKX
    (
        ALL('Product'[Subcategory]),
        [Prodeje]
    )
)

Jiná je pak situace v počítaných sloupcích. V počítaných sloupcích je všudypřítomný kontext řádku, ale není k dispozici žádný kontext filtru. Následující výpočet vytvořený v tabulce  'Product' proto nefunguje.

Počítaný sloupec:

(Počítaný sloupec) Pořadí podle prodejů ŠPATNĚ =
RANKX
(
    'Product',
    SUM(Sales[Sales Amount])
)

Výsledek je v každém řádku  tabulky stejný, protože funkce SUM() uvedená v druhém argumentu funkce RANKX(), stejně jako všechny ostatní sumarizační funkce, ignoruje kontext řádku.

Nefunkční funkce RANKX v Power BI 11

Řešením v tomto případě může být vložení funkce SUM() do funkce CALCULATE(), která změní kontext řádku na kontext filtru.

Počítaný sloupec:

(Počítaný sloupec) Pořadí podle prodejů =
RANKX
(
    'Product',
    CALCULATE(SUM(Sales[Sales Amount]))
)

Výše uvedený výpočet již vrací pořadí produktů podle sumy prodejů. Stejného výsledku bychom dosáhli také při použití měřítka [Prodeje] ve druhém argumentu funkce, protože každé měřítko je na pozadí vyhodnoceno ve funkci CALCULATE().

Nefunkční funkce RANKX v Power BI 12

Jak můžeme vidět na obrázku výše, nová verze počítaného sloupce již vrací očekávané výsledky.

Shrnutí

Tento příspěvek shrnuje časté chyby při použití funkce RANKX() pro vytvoření pořadí. Funkce RANKX() je jedna ze složitějších funkcí. Při použití RANKX() bychom měli mít na paměti kontext, ve kterém jsou vyhodnoceny jednotlivé argumenty této funkce. Další informace o způsobu vyhodnocení jednotlivých argumentů funkce RANKX() můžete najít v samostatném příspěvku. Jakmile si osvojíme kontext vyhodnocení jednotlivých argumentů, mělo by se stát používání funkce RANKX() jednoduchou záležitostí. Pokud jste nenašli řešení Vašeho problému s funkcí RANKX() v tomto příspěvku, můžete se podělit o Vaši zkušenost v komentářích.

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

Komentáře