DAX funkce LOOKUPVALUE

DAX funkce LOOKUPVALUE

Funkce LOOKUPVALUE() v jazyku DAX je velmi podobná funkci SVYHLEDAT() v Excelu. Na rozdíl od Excelu, v Tabulárním modelu jsou obvykle mezi tabulkami vytvořeny relace. V takovém případě je efektivnější a jednoduší pro načtení hodnot z jiné tabulky použít funkci RELATED()Funkci LOOKUPVALUE() obvykle používáme v jazyku DAX pouze ve vybraných specifických případech.

LOOKUPVALUE() vrací hodnotu z prohledávané tabulky, která odpovídá podmínce ve druhém a třetím argumentu funkce. Pokud potřebujeme, můžeme volitelně přidat více podmínek v dalších argumentech funkce, vždy v páru prohledávaný sloupec a hledaná hodnota. Syntaxe funkce LOOKUPVALUE() vypadá následovně.

Syntaxe funkce LOOKUPVALUE():

LOOKUPVALUE
(
<Sloupec s výsledkem>,
<Prohledávaný sloupec>, <Hledaná hodnota>
[, <Prohledávaný sloupec 2>, <Hledaná hodnota 2>]…
[, <Alternativní výsledek>]
)

Prvním argumentem funkce je název sloupce, ze kterého chceme získat výslednou hodnotu. Výsledná hodnota bude ze stejného řádku prohledávané tabulky, ve kterém bude hodnota z prohledávaného sloupce ve druhém argumentu funkce odpovídat hledané hodnotě ve třetím argumentu funkce. Hledaná hodnota ve třetím argumentu funkce může být načtena ze sloupe na základě aktuálního kontextu řádku, ve kterém je funkce vyvolána. Dále můžeme ve třetím argumentu funkce použít konstantu nebo jinou funkci vracející v aktuálním kontextu skalární hodnotu.

První tři argumenty jsou povinné. Volitelně můžeme přidat další podmínky, případně můžeme definovat alternativní výsledek. Výsledkem funkce LOOKUPVALUE() bude alternativní výsledek v situaci, kdy definovaným podmínkám odpovídá více rozdílných hodnot ve sloupci s výsledkem a nebo v případě, kdy podmínkám nebude odpovídat žádná hodnota ve sloupci v prvním argumentu funkce.
Pokud nepoužijeme možnost alternativního výsledku a podmínkám definovaným ve funkci neodpovídá žádná hodnota ve sloupci v prvním argumentu funkce, výsledkem bude hodnota BLANK. Na druhou stranu, pokud bude podmínkám odpovídat více rozdílných hodnot, výsledkem funkce bude chybová hláška ERROR. Při použití této funkce bychom proto měli mít jistotu, že výsledkem funkce bude vždy pouze jedna hodnota. 
LOOKUPVALUE() můžeme použít pro vytvoření nového počítaného sloupce nebo v iteračních funkcích při vytváření měřítek. Pokud funkci používáme při vytváření měřítek, LOOKUPVALUE() ignoruje případný kontext filtru v prohledávané tabulce.

Příklad LOOKUPVALUE

První jednoduchý příklad použití funkce LOOKUPVALUE() můžeme vytvořit ve cvičném Power BI souboru Adventure Works DW 2020.pbix. Pokud bychom například chtěli přidat do tabulky 'Sales' barvy produktů z tabulky 'Product', můžeme k vytvoření počítaného sloupce použít následující vzorec.

Počítaný sloupec:

Barva prodaného produktu =
LOOKUPVALUE
(
'Product'[Color],
'Product'[ProductKey], Sales[ProductKey]
)

Prvním argumentem funkce je název sloupce, ze kterého chceme získat výslednou hodnotu - sloupec s barvami produktů. Druhým argumentem je název sloupce z prohledávané tabulky, ve kterém chceme najít hodnotu ze třetího argumentu funkce. Podmínka ověřuje v každém řádku tabulky 'Sales', zda se hodnota ze sloupce 'Sales'[ProductKey] v aktuálním řádku iterace rovná některé z hodnot ve sloupci 'Product'[ProductKey] v prohledávané tabulce. Pokud je nalezena shoda, dojde k načtení hodnoty ze sloupce 'Product'[Color] do aktuálního řádku v tabulce 'Sales', ve kterém je podmínka splněna. Výsledkem je nový počítaný sloupec v tabulce 'Sales', který obsahuje barvy prodaných produktů. 

DAX funkce LOOKUPVALUE 2

K výše uvedenému příkladu je třeba doplnit dvě důležité poznámky. 

Druhým argumentem funkce LOOKUPVALUE() je sloupec 'Product'[ProductKey], což je primární klíč tabulky 'Product'. Protože prohledáváme sloupec, který je současně primární klíč v prohledávané tabulce, máme v tomto příkladu jistotu, že výsledkem funkce LOOKUPVALUE() bude pouze jedna hodnota, což je základní předpoklad pro použití této funkce.

Další důležitou poznámkou je fakt, že mezi tabulkou 'Sales' a tabulkou 'Product' je vytvořená relace. Tabulka 'Sales' je s tabulkou 'Product' ve vztahu MANY-TO-ONE, to znamená že každému záznamu v tabulce 'Sales' odpovídá vždy jenom jeden záznam v tabulce 'Product'.

DAX funkce LOOKUPVALUE 3

V takovém případě není nutné používat funkci LOOKUPVALUE(). Díky relaci můžeme získat kteroukoliv hodnotu z tabulky 'Product' jednodušeji a efektivněji použitím funkce RELATED().

Počítaný sloupec:

Barva prodaného produktu 2 = RELATED('Product'[Color])

Pokud existují mezi tabulkami relace, můžeme se vyhnout použití funkce LOOKUPVALUE() a požadované hodnoty získat i jednodušeji.

Funkce LOOKUPVALUE() může být užitečná v situacích, kdy mezi tabulkami z jakéhokoliv důvodu nemůžeme vytvořit relaci. Dále může být funkce LOOKUPVALUE() užitečná, pokud chceme získat hodnotu ze stejné tabulky, ve které nový počítaný sloupec vytváříme, například při tvorbě Parent - Child hierarchie. LOOKUPVALUE() je možné použít také v případě, kdy potřebujeme porovnat více podmínek pro získání správné hodnoty a současně nechceme nebo nemůžeme vytvářet relace na základě složených klíčů na základě hodnot z několika sloupců. Tato situace je znázorněna v následujícím příkladu.

Vyhledání hodnoty na základě více podmínek pomocí LOOKUPVALUE

V následujícím příkladu budeme pracovat s jednoduchou tabulkou, která bude obsahovat kurzovní lístek pro dvě měny. Kurzy se budou vztahovat ke konci kalendářního roku. Cílem příkladu bude přepočítat částku prodejů v tabulce 'Sales' do požadované měny podle kurzu, který bude odpovídat roku, ve kterém proběhl prodej produktů. Pomocí funkce LOOKUPVALUE() tedy budeme hledat v kurzovním lístku hodnotu odpovídající dvěma podmínkám. První podmínkou bude aktuální rok v době vzniku objednávky, druhou podmínkou bude požadovaná měna, do které chceme původní hodnotu přepočítat.

Tabulku s kurzy a roky si můžeme v Power BI souboru vytvořit jednoduše kliknutím na možnost "New table" na kartě "Modeling".

DAX funkce LOOKUPVALUE 4

Do DAX editoru můžeme vložit následující kód, který vygeneruje tabulku se třemi sloupci a osmi řádky. Tabulka bude představovat kurzovní lístek, podle kterého budeme následně přepočítávat původní hodnoty v tabulce 'Sales'.

Počítaná tabulka:

Kurzovní lístek =
SELECTCOLUMNS
(
    {
     ( 2017, "EUR", 0.845 ),
     ( 2018, "EUR", 0.879 ),
     ( 2019, "EUR", 0.900 ),
     ( 2020, "EUR", 0.822 ),
     ( 2017, "CZK", 21.668 ),
     ( 2018, "CZK", 22.693 ),
     ( 2019, "CZK", 22.940 ),
     ( 2020, "CZK", 21.625 )
    },
    "Rok", [Value1],
    "Měna",[Value2],
    "Kurz",[Value3]
)

Výsledná tabulka by měla vypadat následovně.

DAX funkce LOOKUPVALUE 5

V tabulce 'Sales' jsou v použitém modelu prodeje za čtyři roky. Tabulka s kurzovním lístkem proto obsahuje osm řádků. Každý řádek představuje záznam pro daný rok a měnu s kurzem vůči USD ke konci kalendářního roku. Mezi tabulkou 'Sales' a novou tabulkou obsahující kurzy v CZK a v EUR není vytvořená relace. Právě v tomto případě může být pro vyhledání hodnot vhodná funkce LOOKUPVALUE().

DAX funkce LOOKUPVALUE 6

V tabulce 'Sales' není k dispozici záznam o roku, ve kterém došlo k prodeji. Tento údaj musíme získat ze sloupce 'Sales'[OrderDateKey], který je ve formátu "rrrrMMdd". Aktuální rok prodeje získáme z tohoto sloupce jednoduše pomocí funkce LEFT(), díky které načteme z hodnot ve sloupci 'Sales'[OrderDateKey] pouze první čtyři znaky. Dále budeme k výpočtu hodnoty prodejů ve vybrané měně potřebovat hodnotu prodejů v původní měně a zkratku měny, do které budeme hodnotu prodejů převádět. Všechny tyto mezivýpočty si můžeme uložit do proměnných, a následně je použít k získání výsledné hodnoty v požadované měně. Výpočet hodnoty prodejů v CZK může vypadat následovně.

Počítaný sloupec:

Prodeje v CZK =
VAR ProdejeUSD = Sales[Sales Amount]
VAR VybranaMena = "CZK"
VAR RokProdeje = INT(LEFT(Sales[OrderDateKey], 4))
VAR KurzVAktualnimRoce =
LOOKUPVALUE
(
'Kurzovní lístek'[Kurz],
'Kurzovní lístek'[Rok], RokProdeje,
'Kurzovní lístek'[Měna], VybranaMena
)

VAR Vysledek = ProdejeUSD * KurzVAktualnimRoce
RETURN
Vysledek

Výsledkem funkce LOOKUPVALUE() je v každém řádku tabulky kurz v CZK měně, který odpovídá roku, ve kterém došlo k uskutečnění objednávky. Tímto kurzem v každém řádku nového počítaného sloupce vynásobíme původní hodnotu prodejů v USD, která je v tabulce 'Sales' ve sloupci 'Sales'[Sales Amount].

Pokud bychom chtěli vytvořit jiný počítaný sloupec, který bude obsahovat hodnoty prodejů v přepočtu na EUR, výpočet bude velmi podobný, pouze s jinou zkratkou měny v proměnné VybranaMena.

Počítaný sloupec:

Prodeje v EUR =
VAR ProdejeUSD = Sales[Sales Amount]
VAR VybranaMena = "EUR"
VAR RokProdeje = INT(LEFT(Sales[OrderDateKey], 4))
VAR KurzVAktualnimRoce =
LOOKUPVALUE
(
'Kurzovní lístek'[Kurz],
'Kurzovní lístek'[Rok], RokProdeje,
'Kurzovní lístek'[Měna], VybranaMena
)

VAR Vysledek = ProdejeUSD * KurzVAktualnimRoce
RETURN
Vysledek

Stejně jako u CZK měny, i nyní musíme ve funkci LOOKUPVALUE() použít dvě podmínky, abychom  ze sloupce 'Kurzovní lístek'[Kurz] získali jednu výslednou hodnotu s kurzem v aktuálním roce. První podmínkou je aktuální rok vzniku objednávky, druhou podmínkou je zvolená měna. 

DAX funkce LOOKUPVALUE 7

Výsledkem jsou dva nové počítané sloupce, které obsahují hodnotu prodejů v aktuálním řádku přepočítanou kurzem vybrané měny ke konci aktuálního roku, ve kterém došlo k prodeji. 

Shrnutí

Funkce LOOKUPVALUE() je užitečná funkce, která může nahradit chybějící relace v modelu. Na druhou stranu vždy, když existuje mezi prohledávanou tabulkou a tabulkou, do které chceme hodnoty přidat odpovídající relace, můžeme namísto funkce LOOKUPVALUE() použít funkci RELATED(). Funkci LOOKUPVALUE() můžeme využít v případech, kdy hledaná hodnota odpovídá více podmínkám a nemůžeme nebo nechceme vytvářet mezi tabulkami relaci na základě složených klíčů. Dále může být funkce LOOKUPVALUE() užitečná v situacích, kdy je hledaná hodnota ve stejné tabulce, do které chceme výsledek funkce přidat. Při použití funkce LOOKUPVALUE() bychom měli mít jistotu, že definovaným podmínkám bude v prohledávané tabulce odpovídat pouze jedna hodnota. V opačném případě může funkce vracet chybu, kterou můžeme nahradit alternativním výsledkem, který vkládáme do posledního argumentu funkce. V případě, že hledaným podmínkám neodpovídá žádná hodnota v prohledávané tabulce, výsledkem funkce bude hodnota BLANK, případně hodnota z alternativního výsledku, pokud tuto hodnotu zadáme. 

Oficiální Microsoft dokumentace funkce LOOKUPVALUE:
č. 32

Komentáře