Typickým příkladem relace mezi dvěma tabulkami na základě rozsahu je zařazení hodnot z jedné tabulky do kategorií, kdy kategorie jsou uložené v jiné tabulce, a daná kategorie je definována spodní a horní hranicí, do které musí cílová hodnota patřit. V tomto přípěvku si ukážeme dva možné přístupy jak pomocí jazyka DAX vyjádřit vztah mezi dvěma tabulkami na základě rozsahu v případě, kdy v tabulkách nemáme k dispozici potřebné klíče pro vytvoření standardní relace.
(Tento článek je v revizi.)
V Tabulárním modelu můžeme vytvořit relace s různou kardinalitou (1:M, M:N, 1:1) a s různým nastavením směru propagace filtrů (jednosměrné, obousměrné). Existují ale situace, kdy vytvořit relaci mezi tabulkami jednoduše není možné, protože zkrátka nemáme k dispozici potřebné klíče (sloupce určené pro vytvoření relací).
Uvažujme například situaci, kdy máme model který zachycuje mimo jiné prodeje produktů přes různé obchodní kanály. Jedná se o nadnárodní firmu, která má celou řadu možností jak prodávat své produkty. Prodeje se tak uskutečňují v různých zemích přes kamenné prodejny, přes obchodníky, přes katalogové prodeje nebo přes internet. Informace o obchodech jsou uloženy ve standardní dimenzní tabulce, kdy každý obchod má v této tabuce jeden záznam.
Po několika letech existence daného modelu vznikne požadavek ohodnotit obchody podle jejich výkonnosti. Do modelu tak bude přidána nová tabulka, která bude obsahovat kategorie obchodů. Kategorie jsou čtyři (výborná, dobrá, špatná, velmi špatná) a daný obchod bude do vybrané kategorie zařazen podle objemu prodejů, který bude přepočítán na počet zaměstnanců. Problémem je že mezi tabulkou s obchody a tabulku s kategoriemi neexistuje relace, a nemáme k dispozici ani potřebné klíče pro vytvoření odpovídající relace. V tabulce s obchody totiž není kategorie pro každý objem prodejů, ale jsou zde kategorie pro určitý rozsah prodejů. Každá kategorie má spodní a horní hranici, a aby byl obchod zařazen do kategorie, musí být přepočítaný objem prodejů na jednoho zaměstnance v rozsahu daným minimální a maximální hodnotou pro danou kategorii.
V následující části si ukážeme dva možné přístupy pro vyřešení výše popsaného problému. V prvním přistupu nebudeme tvořit relaci, ale v tabulce s obchody si vytvoříme nový počítaný sloupec, do kterého si pomocí DAX výrazu uložíme název kategorie, do které příslušný obchod spadá. Toto řešení je ideální pokud nám stačí do tabulky s obchody přidat jeden sloupec. V případě, kdy by tabulka s kategoriemi obsahovala celou řadu sloupců, které jsou užitečné pro tvorbu reportů, je obvykle lepší vytvořit mezi tabulkymi relaci. Proto si ukážeme i druhý přístup, ve kterém si pomocí jazyka DAX vytvoříme potřebné klíče pro vytvoření standardní relace.
Poznámka pro autora: Odstranit klíče z tabulky hodnocneí, a v druhém příkladu je vytvořit pomocí ROWNUMBER().
Vztahy mezi tabulkami na základě rozsahu a jazyk DAX
Celý příklad je vytvořen ve cvičném Power BI souboru Contoso Sales Sample for Power BI Desktop.pbix. Soubor s řešením je dostupný ke stažení níže pod tímto příspěvkem.
V použitém modelu je mimo jiné dimenzní tabulka s názvem 'Stores', která obsahuje jeden záznam pro každý obchod. Přes tyto obchody se pak prodávají produkty fiktivní společnosti "Contoso". Záznamy o prodaných produktech jsou v tabulce s názvem 'Sales'.
V tabulce 'Stores' jsou čtyři typy obchodů – Catalog, Online, Reseller a Store. V příkladech uvedených v tomto příspěvku budeme chtít vyhodnotit, zda obchody v dané kategorii dosahovali určité výkonnosti v konkrétním roce. Výkonnost bude vyhodnocena na základě objemu prodejů uskutečněných přes každý obchod. Objem prodejů přes konkrétní obchod ještě přepočítáme na počet zaměstnanců v daném obchodě. Dále budeme chtít při zařazení obchodu do výkonnostní kategorie rozlišovat, o jaký typ obchodu se jedná, protože nemá smysl porovnávat výkonnost přepočtenou na zaměstnance například Online obchodů s kamennými prodejnami. Obchody budeme řadit do čtyř kategorií podle výkonnosti (Velmi špatná, Špatná, Dobrá, Výborná). Tabulka, kterou budeme používat pro hodnocení výkonnosti obchodů, bude obsahovat čtyři řádky pro každý typ obchodu a sloupce s ID řádku, typem obchodu, kategorií výkonnosti, minimální hranicí pro zařazení do dané kategorie a maximální hranici.
Tabulku s hodnocením si můžeme v Power BI vytvořit jednoduše kliknutím na tlačítko "Nová tabulka", které najdeme na kartě "Modelování". Do okna editoru vzorců pak stačí vložit následující DAX výraz, který vygeneruje výše uvedenou tabulku.
Počítaná tabulka:
Nová tabulka se po vytvoření stane součástí modelu, nicméně mezi tabulkou 'Hodnocení' a tabulkou 'Stores' nyní nemůžeme vytvořit relaci. V tabulce 'Stores' neexistuje klíč, který bychom mohli použít pro vytvoření relace s tabulkou 'Hodnocení'. Abychom mohli přiřadit hodnocení ke konkrétnímu obchodu, musíme nejdříve:
- Vypočítat prodeje přes daný obchod v konkrétním roce.
- Přepočítat prodeje přes daný obchod na jednoho zaměstnance.
- Zjistit typ daného obchodu (Catalog, Online, Store, Reseller).
- Na základě prodejů na zaměstnance a typu obchodu přiřadit výkonnost obchodu z tabulky 'Hodnocení'.
Vytvoření nového sloupce na základě vyhodnocení více podmínek
Počítaný sloupec v tabulce 'Stores':
Výsledkem je nový počítaný sloupec v tabulce 'Stores'. Tento sloupec pak můžeme použít v Power BI vizuálech a podívat se tak například, kolik obchodů patří do každé kategorie.
Měřítko:
Na obrázku níže můžeme vidět, že nejvíce obchodů má hodnocení výkonnosti "Dobrá", naopak hodnocení výkonnosti "Špatná" má pouze 17 obchodů z celkového množství 306.
Pokud bychom chtěli propojit tabulku 'Hodnocení' s tabulkou 'Stores' pomocí relace, musíme pro vytvoření počítaného sloupce v tabulce 'Stores' s klíčem určeným pro relaci použít trochu jiný postup.
Vytvoření relace na základě rozsahu
Počítaný sloupec v tabulce 'Stores':
Na základě nového počítaného sloupce již můžeme vytvořit relaci mezi tabulkami 'Hodnocení' a 'Stores'.
V takto vytvořeném modelu můžeme s tabulkou 'Hodnocení' pracovat jako s kteroukoliv jinou dimenzní tabulkou.
Shrnutí
Komentáře
Okomentovat