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
Měřítko:
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ů.
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:
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.
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:
Jak je vidět na obrázku níže, nově definované měřítko již vrací očekávané výsledky.
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ů.
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.
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:
Jak je vidět na obrázku níže, nová verze měřítka již vrací očekávané výsledky.
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:
Problém s takto definovaným měřítkem nastane, když dojde na vyhodnocení druhého argumentu funkce v originálním kontextu.
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:
Výsledek výše uvedeného měřítka můžeme vidět na následujícím obrázku.
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:
Pokud tento výpočet použijeme v kontextu jednotlivých podkategorií, vše funguje tak jak má.
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.
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:
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:
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.
Ř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:
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().
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.
Komentáře
Okomentovat