Pořadí v kategorii a pořadí napříč kategoriemi v jazyku DAX

Pořadí v kategorii a pořadí napříč kategoriemi v jazyku DAX

V tomto příspěvku jsou uvedeny dva typy příkladů s výpočty pořadí položek podle zvoleného kritéria. V prvním typu příkladu půjde o vytvoření pořadí položek napříč nadřazenými kategoriemi v hierarchii. V druhém typu příkladu budeme zjišťovat pořadí položek uvnitř nadřazené kategorie. K vytvoření pořadí bude ve všech příkladech použita DAX funkce RANKX(). Protože je chování funkce RANKX() odlišné při použití v měřítku a v počítaném sloupci, ostatně jako většiny DAX funkcí z důvodu odlišného kontextu vyhodnocení, ukážeme si příklady obou typů výpočtů jak v měřítku, tak v počítaném sloupci.

Všechny výpočty jsou vytvořeny ve cvičném Power BI souboru Adventure Works DW 2020.pbix, který je volně dostupný ke stažení na internetu. Power BI soubor s řešením je pak dostupný ke stažení níže pod tímto příspěvkem.

Jak již bylo uvedeno výše, pro určení pořadí budeme používat funkci RANKX(), která je v jazyku DAX k dispozici přesně pro tyto účely. Funkce RANKX() má celkem pět argumentů, z toho dva jsou povinné a další tři jsou volitelné. Již samotný počet argumentů funkce RANKX() naznačuje, že tato funkce není z nejjednodušších. Pokud některý z výpočtů uvedených v tomto příspěvku nebude zcela jasný, důvodem může být právě funkce RANKX() a způsob vyhodnocení jednotlivých argumentů této funkce. V takovém případě můžete najít podrobnější informace o funkci RANKX() v samostatném příspěvku, který je možné najít na stránce Jazyk DAX, nebo případně přímo pod tímto odkazem.

Pořadí podle velikosti prodejů

V příkladech uvedených v tomto příspěvku budeme pracovat s měřítkem [Prodeje], které bude vracet sumu za prodané produkty v aktuálním kontextu vyhodnocení a má následující definici.

Měřítko:

Prodeje = SUM(Sales[Sales Amount])

Nové měřítko si můžeme vložit do vizuálu Matrix, spolu s kategoriemi a podkategoriemi produktů z tabulky 'Product'.

Pořadí v kategorii a pořadí napříč kategoriemi v jazyku DAX 2

Jak můžeme vidět na obrázku výše, kategorie produktů jsou v hierarchii nadřazeny jednotlivým podkategoriím. V použitém modelu jsou čtyři kategorie (Accessories, Bikes, Clothing, Components), a každá kategorie je pak dále rozdělena na podkategorie produktů. Při vytvoření pořadí jednotlivých podkategorií budeme rozlišovat dva typy výpočtu. První výpočet bude vracet pořadí jednotlivých podkategorií napříč nadřazeným kategoriím. Druhý typ výpočtu bude vracet pořadí podkategorií pouze v rámci nadřazené kategorie.

Pořadí položek napříč kategoriemi v měřítku

K vytvoření pořadí podkategorií napříč kategoriemi budeme potřebovat vytvořit v prvním argumentu funkce RANKX() virtuální tabulku, která bude obsahovat stejné položky, které jsou zobrazené ve vizuálu a pro které chceme vytvořit pořadí. Funkce RANKX() pak na základě této virtuální tabulky zjistí pořadí podle hodnoty výrazu, který použijeme ve druhém argumentu funkce RANKX(). V našem příkladu půjde o měřítko [Prodeje], jehož hodnoty budou použity jako kritérium pro určení pořadí jednotlivých podkategorií, od kategorie s nejvyšší sumou prodejů po nejnižší.

Pozn.: Přesnější popis fungování funkce RANKX() můžete najít v samostatném příspěvku pod tímto odkazem.

Výsledek výpočtu nemá smysl zobrazovat v řádku souhrnů, protože v řádku souhrnů není k dispozici jedna konkrétní podkategorie, pro kterou bychom mohli určit pořadí. Z tohoto důvodu si ještě před zobrazení výsledku výpočtu pomocí funkce IF() ověříme, zda je měřítko vyhodnoceno v řádku s konkrétní podkategorií, a dále zda jsou pro konkrétní podkategorii dostupná data o prodejích. Celý výpočet pořadí podkategorií napříč kategoriemi podle sumy za prodané produkty může vypadat následovně.

Měřítko:

Pořadí podkategorie napříč kategoriemi =
VAR KategorieAPodkategorie =
    ALLSELECTED('Product'[Category],'Product'[Subcategory])
VAR Vypocet =
    RANKX
    (
        KategorieAPodkategorie,
        [Prodeje]
    )
VAR Vysledek =
    IF
    (
        ISINSCOPE('Product'[Subcategory]) && NOT ISBLANK([Prodeje]),
        Vypocet
    )
RETURN
    Vysledek

Nové měřítko si můžeme vložit do vizuálu Tabulka, spolu s hodnotami ze sloupce 'Product'[Category], 'Product'[Subcategory] a měřítkem [Prodeje].

Pořadí v kategorii a pořadí napříč kategoriemi v jazyku DAX 3

Jak můžeme vidět na obrázku výše, měřítko [Pořadí podkategorií napříč kategoriemi] vrací pořadí jednotlivých podkategorií, bez ohledu na to, do které kategorie daná položka patří. První tři podkategorie v pořadí spadají do kategorie "Bikes". Podkategorie na čtvrtém až šestém místě v pořadí patří do kategorie "Components", na sedmém místě je podkategorie patřící do kategorie "Clothing", atd. Nezávislost pořadí jednotlivých podkategorií na nadřazené kategorii můžeme lépe pozorovat na následujícím obrázku, kde je namísto vizuálu Tabulka použitý vizuál Matrix.

Pořadí v kategorii a pořadí napříč kategoriemi v jazyku DAX 4

Pokud bychom chtěli vytvořit měřítko, které bude vracet pořadí podkategorií v každé kategorii samostatně, tedy vždy v každé kategorii znovu od čísla 1, musíme ve výpočtu změnit tabulku v prvním argumentu funkce RANKX(), která je základem pro určení pořadí.

Pořadí položek v rámci kategorie v měřítku

K vytvoření pořadí v rámci kategorie můžeme vycházet z předchozího měřítka, ve kterém nám bude stačit upravit virtuální tabulku v prvním argumentu funkce RANKX(). Tato tabulka bude obsahovat nově pouze jeden sloupec, se všemi podkategoriemi produktů, které jsou zobrazené ve vizuálu. Protože bude při vyhodnocení funkce RANKX() stále aktivní vnější filtr s aktuální kategorií, měřítko [Prodeje] bude pro podkategorie, které nepatří k aktuální kategorii, vracet hodnotu BLANK a tyto podkategorie tak budou z tabulky určené pro pořadí vyřazeny. Samotný výpočet pak může vypadat následovně.

Měřítko:

Pořadí podkategorie v kategorii =
VAR Podkategorie = ALLSELECTED('Product'[Subcategory])
VAR Vypocet =
    RANKX
    (
        Podkategorie,
        [Prodeje]
    )
VAR Vysledek =
    IF
    (
        ISINSCOPE('Product'[Subcategory]) && NOT ISBLANK([Prodeje]),
        Vypocet
    )
RETURN
    Vysledek

Nové měřítko si můžeme vložit do původního vizuálu Matrix, a zobrazit si rozdíl mezi měřítky [Pořadí podkategorie napříč kategoriemi] a [Pořadí podkategorie v kategorii].

Pořadí v kategorii a pořadí napříč kategoriemi v jazyku DAX 5

Měřítko [Pořadí podkategorie v kategorii] vrací pořadí aktuální podkategorie v rámci nadřazené kategorie. Naproti tomu, původní měřítko [Pořadí podkategorie napříč kategoriemi] vrací pořadí podkategorií bez ohledu na kategorii, do které aktuální podkategorie patří. Pokud bychom chtěli vytvořit pořadí položek k nadřazené položce v hierarchii staticky v rámci počítaného sloupce, musíme použít trochu jiný postup, protože v rámci definice počítaných sloupců nepůsobí na výpočet kontext filtru, ale pouze kontext řádku.

Pořadí položek napříč kategoriemi v počítaném sloupci

V počítaném sloupci, na rozdíl do vizuálů v reportech, pracujeme s pevně danou strukturou tabulky. Strukturu tabulky načtené v modelu nemůžeme jednoduše změnit tak, jak můžeme měnit strukturu tabulek ve vizuálech. Musíme proto počítat s granularitou, která je pevně daná. Pokud budeme v příkladu nadále pracovat s tabulkou 'Product', tak tato tabulka obsahuje v každém řádku informace o jednom konkrétním produktu. Pokud bychom chtěli vytvořit v takovéto tabulce pořadí podkategorií v rámci kategorií, výsledná hodnota by se opakovala pro každý produkt patřící do aktuální kategorie. Takovýto výpočet mohl v určitých typech úloh sice dávat smysl, nicméně spíše jako mezi výpočet pro další analýzu.

Přirozenější bude, vzhledem ke struktuře tabulky, vytvoření počítaného sloupce, který bude vracet pořadí jednotlivých produktů napříč kategoriemi.

V počítaném sloupci již v prvním argumentu funkce RANKX() nebudeme muset používat funkci ALLSELECTED() nebo funkci ALL() k odstranění vnějších filtrů, protože při vyhodnocení výrazu určeného pro počítané sloupce nepůsobí na výpočet žádné vnější filtry. Ve druhém argumentu funkce RANKX() pak můžeme použít měřítko [Prodeje], které bude pro každý produkt vracet sumu za prodeje tohoto produktu, díky změně kontextu řádku na kontext filtru. Výpočet pořadí produktů napříč kategoriemi v počítaném sloupci pak může vypadat následovně.

Počítaný sloupec:

Pořadí produktu podle prodejů (Počítaný sloupec) =
RANKX
(
    'Product',
    [Prodeje]
)

Pokud hodnoty z nového počítaného sloupce vložíme do vizuálu v Power BI reportu, spolu s kategoriemi produktů, názvy produktů a měřítkem [Prodeje], výsledek může vypadat následovně.

Pořadí v kategorii a pořadí napříč kategoriemi v jazyku DAX 6

Na obrázku výše můžeme vidět, že největší tržby byly zaznamenány u produktů z kategorie "Bikes". První produkt v pořadí, který nepatří do kategorie "Bikes", se nachází na až 76 místě v pořadí.

Pořadí v kategorii a pořadí napříč kategoriemi v jazyku DAX 7

Pokud bychom chtěli vytvořit v počítaném sloupci pořadí produktů v rámci kategorie, do které daný produkt patří, můžeme opět vycházet z předcházejícího výpočtu, ve kterém pouze upravíme virtuální tabulku vytvořenou pro první argumentu funkce RANKX().

Pořadí položek v rámci kategorie v počítaném sloupci

Možností, jak vytvořit v počítaném sloupci pořadí produktů uvnitř kategorie, do které aktuální produkt patří, je více. Jednou z možností je vytvořit v prvním argumentu funkce RANKX() virtuální tabulku, která bude obsahovat pouze produkty ze stejné kategorie, do které patří produkt v aktuálním řádku tabulky uložené v modelu. Aktuální kategorii si můžeme uložit do proměnné, a tuto proměnou pak použít ve funkci FILTER() pro zafiltrování tabulky virtuální, která bude použita pro určení pořadí produktů v kategorii.

Počítaný sloupec:

Pořadí produktů podle prodejů v kategorii (Počítaný sloupec) =
VAR AktualniKategorie = 'Product'[Category]
VAR ProduktyVAktualniKategorii =
    FILTER
    (
        'Product',
        'Product'[Category] = AktualniKategorie
    )
VAR Vypocet =
    RANKX
    (
        ProduktyVAktualniKategorii,
        [Prodeje]
    )
RETURN
    Vypocet

Výsledek si můžeme zobrazit v Power BI vizuálu Tabulka.

Pořadí v kategorii a pořadí napříč kategoriemi v jazyku DAX 8

Na obrázku výše můžeme vidět, že hodnoty s počítaného sloupce 'Product'[Pořadí produktu podle prodejů (Počítaný sloupec)] jsou pro kategorii "Bikes" stejné, jako hodnoty nového počítaného sloupce 'Product'[Pořadí produktů podle prodejů v kategorii (Počítaný sloupec)]. Jakmile se ve výčtu jednotlivých produktů dostaneme do jiné kategorie, hodnoty se již budou rozcházet, protože ve sloupci 'Product'[Pořadí produktů podle prodejů v kategorii (Počítaný sloupec)] je vytvořeno pořadí pro každou kategorii zvlášť.

Pořadí v kategorii a pořadí napříč kategoriemi v jazyku DAX 9

Na obrázku výše již můžeme vidět, že hodnoty obou počítaných sloupců se začnou rozcházet, jakmile dojde ke změně v kategorii v prvním sloupci použítého vizuálu.

Shrnutí

V příkladech uvedených v tomto příspěvku jsme mohli vidět výpočty pořadí položek napříč nadřazeným kategoriím a výpočty s pořadím v rámci kategorie, do které aktuální položka patří. Výpočty pořadí se lišily v měřítku a v počítaném sloupci, a to z důvodu odlišného kontextu vyhodnocení. Rozdíl mezi výpočtem pořadí v počítaném sloupci a v měřítku je zásadní i z pohledu použitelnosti v reportech. Měřítka jsou vyhodnocena až na úrovni reportu, a jejich výsledek mohou ovlivnit filtry, které si uživatel může měnit podle vlastního uvážení. Na druhou stranu, pořadí produktů vytvořené v počítaném sloupci žádné uživatelské filtry nezmění, protože tyto hodnoty jsou součástí modelu a k jejich přepočítání dojde pouze v době vytvoření počítaného sloupce, nebo v době načítání dat do modelu. Rozdíl mezi počítanými sloupci a měřítky je podrobněji popsán v samostatném příspěvku.

Další příklady můžete najít na stránce DAX – příklady nebo na stránce Power BI. Pokud máte jakékoliv dotazy nebo připomínky k tomuto tématu, můžete zanechat komentář níže pod tímto příspěvkem.

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

Komentáře