DAX funkce HASONEVALUE a SELECTEDVALUE

Úvodní obrázek

Funkce HASONEVALUE() je logická funkce dostupná v jazyku DAX, která vrací hodnotu TRUE, pokud je ve sloupci uvedeném v argumentu této funkce v aktuálním kontextu vyhodnocení dostupná pouze jedna hodnota. Pokud je v aktuálním kontextu vyhodnocení k dispozici více hodnot ze sloupce zadaného v argumentu funkce HASONEVALUE(), výsledkem funkce bude hodnota FALSE.  Další užitečná DAX funkce je funkce SELECTEDVALUE(), která vrací přímo konkrétní hodnotu ze sloupce v prvním argumentu, která je v aktuálním kontextu vyhodnocení dostupná. Pokud je v aktuálním kontextu vyhodnocení dostupných více hodnot ze sloupce v prvním argumentu funkce SELECTEDVALUE(), výsledkem bude hodnota BLANK, nebo případný alternativní výsledek uvedený ve druhém argumentu funkce SELECTEDVALUE(). Tento příspěvek obsahuje jednoduché příklady použití funkcí HASONEVALUE() a SELECTEDVALUE().

DAX funkce HASONEVALUE a SELECTEDVALUE

Všechny příklady v tomto příspěvku jsou vytvořeny ve cvičném souboru Adventure Works DW 2020.pbix. Odkaz na stažení souboru s řešením můžete najít níže pod tímto příspěvkem.

Funkce HASONEVALUE

Funkce HASONEVALUE() je logická funkce, která vrací hodnoty TRUE nebo FALSE. Pokud je v aktuálním kontextu vyhodnocení dostupná pouze jedna hodnota ze sloupce, který je uvedený v argumentu této funkce, výsledkem bude hodnota TRUE. Pokud bude v aktuálním kontextu dostupných více hodnot v použitém sloupci, výsledkem bude hodnota FALSE. Syntaxe funkce HASONEVALUE() je velmi jednoduchá.

Syntaxe funkce HASONEVALUE:

HASONEVALUE(<Název sloupce>)

Funkce HASONEVALUE() je na použití jednoduchá funkce. Uvažujme například následující měřítko vytvořené ve cvičném Power BI souboru.

Měřítko:

HASONEVALUE Subcategory = HASONEVALUE('Product'[Subcategory])

Výsledek měřítka si můžeme vložit do vizuálu karta. Pokud při vyhodnocení měřítka nepůsobí na model žádný filtr, výsledkem bude hodnota FALSE, protože v aktuálním kontextu je k dispozici více hodnot ze sloupce s podkategoriemi produktů.

DAX funkce HASONEVALUE a SELECTEDVALUE

Pokud v průřezu vybereme pouze jednu podkategorii produktů, výsledkem měřítka [HASONEVALUE Subcategory] bude hodnota TRUE. 

DAX funkce HASONEVALUE a SELECTEDVALUE 2

Pokud v průřezu vybereme více podkategorií, výsledkem bude opět hodnota FALSE.

DAX funkce HASONEVALUE a SELECTEDVALUE 3

Funkce HASONEVALUE() nerozlišuje, zda je filtr vytvořen v průřezu nebo v jiném vizuálu. Pokud například vložíme do řádků ve vizuálu Matrix hierarchii s kategoriemi, podkategoriemi a modely produktů, výsledek bude vypadat následovně.

DAX funkce HASONEVALUE a SELECTEDVALUE 4

Pokud je měřítko vyhodnoceno na úrovni kategorií produktů, vrací hodnotu FALSE, protože do každé kategorie patří více podkategorií. Pokud je měřítko vyhodnoceno v řádcích s podkategoriemi produktů, vrací hodnotu TRUE, protože v každém jednom řádku s podkategoriemi produktů je dostupná pouze jedna konkrétní podkategorie. Pokud rozbalíme podkategorii produktů ve vizuálu tak, abychom viděli další úroveň s jednotlivými modely, výsledek bude vypadat následovně.

DAX funkce HASONEVALUE a SELECTEDVALUE 5

Měřítko [HASONEVALUE Subcategory] vrací hodnotu TRUE také na úrovni jednotlivých modelů, protože každý model patří pouze do jedné podkategorie. Filtr vytvořený konkrétním modelem proto filtruje nepřímo také sloupec s podkategoriemi produktů pouze na jednu konkrétní podkategorii, do které daný model patří. 

Příklad HASONEVALUE

Jako příklad použití funkce HASONEVALUE() si můžeme vytvořit jednoduché měřítko, které bude vracet počet pracovních dnů ve vybraném období. Pro zjednodušení nebudeme brát v úvahu svátky. Jako pracovní dny tedy budeme brát všechny dny od pondělí do pátku, a víkendové dny budeme považovat za volné dny. Takto popsaný výpočet můžeme vytvořit následujícím způsobem.

Měřítko:

Počet pracovních dnů =
CALCULATE
(
    COUNTROWS('Date'),
    'Date'[Den v týdnu] IN {1,2,3,4,5}
)

Nové měřítko můžeme vložit do vizuálu Matrix, s roky, měsíci a dny v řádcích vizuálu. 

DAX funkce HASONEVALUE a SELECTEDVALUE 6

Jak můžeme vidět na obrázku výše, měřítko vrací počet pracovních dnů v závislosti na období, ve kterém je zobrazeno. Na úrovni jednotlivých dnů vrací měřítko hodnotu 1, protože každý jeden den zafiltruje tabulku 'Date' pouze na jeden konkrétní řádek. Zobrazení počtu dnů v pro konkrétní den tedy nedává moc smysl. Následující měřítko bude vracet počet dnů pouze v případě, kdy aktuální obsahuje více než jeden den.

Měřítko:

Počet pracovních dnů 2 =
IF
(
    HASONEVALUE('Date'[Date]),
    BLANK(),
    CALCULATE
    (
        COUNTROWS('Date'),
        'Date'[Den v týdnu] IN {1,2,3,4,5}
    )
)

Před vyhodnocením výpočtu počtu pracovních dnů ve funkci IF() ověřujeme, zda má sloupec 'Date'[Date] v aktuálním kontextu vyhodnocení jednu jedinečnou hodnotu. Pokud ano, nebudeme zobrazovat výpočet, ale prázdnou hodnotu BLANK(). Ve všech ostatních případech zobrazíme výpočet počtu pracovních dnů. Výsledek můžeme vidět na následujícím obrázku.

DAX funkce HASONEVALUE a SELECTEDVALUE 7

Rozdíl obou měřítek je na první pohled zřejmý. Obě měřítka vrací stejné hodnoty na úrovni let a měsíců, nicméně na úrovní dnů již měřítko s funkcí HASONEVALUE() nevrací žádné hodnoty.

Funkce SELECTEDVALUE

Funkce SELECTEDVALUE() může být užitečná v situacích, kdy potřebujeme v aktuálním kontextu načíst jednu jedinečnou hodnotu ze sloupce uvedeného v argumentu této funkce. Výsledkem funkce bude jedna konkrétní hodnota pouze v případě, kdy sloupec uvedený v prvním argumentu této funkce obsahuje v aktuálním kontextu právě pouze jednu jedinečnou hodnotu. V opačném případě bude výsledkem funkce hodnota BLANK() nebo alternativní výsledek, pokud je zadán.

Syntaxe funkce SELECTEDVALUE:

SELECTEDVALUE(<Název sloupce>[, <Alternativní výsledek>])

První povinný argument je ve formě názvu sloupce, ze kterého chceme získat hodnotu. Druhý argument je nepovinný a představuje alternativní výsledek v případě, kdy sloupec uvedený v prvním argumentu funkce obsahuje v aktuálním kontextu více různých hodnot.

Podívejme se na velmi jednoduchý příklad, kdy budeme chtít načíst název podkategorie ze sloupce Product[Subcategory] v případě, kdy je v aktuálním kontextu dostupná právě pouze jedna podkategorie. V opačném případě vypíšeme alternativní výsledek.

Měřítko:

SELECTEDVALUE Subcategory = SELECTEDVALUE('Product'[Subcategory], "Více podkategorií")

Pokud takto vytvořené měřítko vložíme do vizuálu karta, a v reportu nepoužijeme žádný filtr, výsledek bude vypadat následovně.

DAX funkce HASONEVALUE a SELECTEDVALUE 7

Výsledkem je alternativní hodnota, protože v aktuálním kontextu je dostupných více hodnot ze sloupce Product[Subcategory]. Pokud do reportu přidáme průřez, ve kterém vybereme pouze jednu podkategorii, výsledkem měřítka bude právě vybraná podkategorie.

DAX funkce HASONEVALUE a SELECTEDVALUE 8

Pokud vybereme v průřezu více podkategorií, výsledkem bude opět alternativní hodnota.

DAX funkce HASONEVALUE a SELECTEDVALUE 9

Měřítko můžeme opět vložit do vizuálu Matrix, a podívat se na výsledky měřítka pro hierarchii s kategoriemi, podkategoriemi a modely. 

DAX funkce HASONEVALUE a SELECTEDVALUE 10

V řádcích s kategoriemi produktů vrací měřítko alternativní výsledek, protože pro každou kategorii je k dispozici více podkategorií. Na úrovni podkategorií  vrací měřítko název právě vybrané podkategorie. Na nižší úrovni, tedy na úrovni jednotlivých modelů, vrací měřítko název podkategorie, do které daný model patří. Každý model patří pouze do jedné podkategorie. Proto když je zafiltrovaný jeden model, je současně v aktuálním kontextu dostupná pouze jedna podkategorie. 

Příklad SELECTEDVALUE

Funkce SELECTEDVALUE() může mít mnoho způsobů využití. Ukázat si můžeme jeden možná trochu netypický příklad. Do modelu si přidáme tabulku, která bude obsahovat názvy modelů, které byly vyřazeny z nabídky. Tabulku si můžeme přidat v Power BI jednoduše kliknutím na kartu "Modelování" a tlačítko "Nová tabulka". Do pole editoru vzorců pak vložíme následující DAX výraz, který vygeneruje tabulku se čtyřmi řádky.

Počítaná tabulka:

Vyřazené modely =
SELECTCOLUMNS
(
    {
        "Mountain-100",
        "Mountain-200",
        "Road-150",
        "Road-250"  
    },
    "Vyřezené modely",
    [Value]
)

Nová tabulka obsahuje jeden sloupec se čtyřmi řádky. V každém řádku je název modelu, který již byl vyřazen z prodejní nabídky. 

DAX funkce HASONEVALUE a SELECTEDVALUE 11

Pokud bychom chtěli vytvořit měřítko, které bude ověřovat, jestli se právě zobrazený model nachází mezi již vyřazenými modely, mohly bychom postupovat následovně.

Měřítko:

Vyřazený model =
IF
(
    SELECTEDVALUE('Product'[Model]) IN
    ALL('Vyřazené modely'[Vyřezené modely]),
    "Vyřazený model",
    BLANK()
)

Pokud je v aktuálním kontextu vyhodnocení dostupný pouze jeden model, tak měřítko v první podmínce ověří, zda tento model nepatří mezi vyřazené modely, které jsou uvedeny v konfigurační tabulce. Pokud vybraný model patří mezi již vyřazené, měřítko vypíše hodnotu "Vyřazený model". V opačném případě bude výsledkem měřítka hodnota BLANK(). Výsledek můžeme vidět na následujícím obrázku.

DAX funkce HASONEVALUE a SELECTEDVALUE 12

Jednoduchou úpravou měřítka můžeme vytvořit podobný výpočet, který můžeme použít pro podmíněné formátování použitého vizuálu. Následující měřítko bude vracet kód pro červenou barvu, pokud bude právě vybraný model patřit mezi vyřazené modely.

Měřítko:

Vyřazený model barva =
IF
(
    SELECTEDVALUE('Product'[Model]) IN
    ALL('Vyřazené modely'[Vyřezené modely]),
    "#FF0000",
    BLANK()
)

Výsledek měřítka [Vyřazený model barva] si můžeme pro ověření funkčnosti zobrazit v použitém vizuálu.

DAX funkce HASONEVALUE a SELECTEDVALUE 13

Měřítko vrací kód pro červenou barvu v kontextu modelů, které jsou již považované za vyřazené z nabídky. Na základě měřítka [Vyřazený model barva] můžeme následně nastavit podmíněný formát pozadí hodnot v použitém vizuálu. Pokud se bude jednat o vyřazený model, hodnoty zobrazené pro vyřazený model budou mít červené pozadí. Výsledek může vypadat následovně.


DAX funkce HASONEVALUE a SELECTEDVALUE 14

K funkci SELECTEDVALUE() ještě zbývá doplnit, že tato funkce nemusí být dostupná ve starších verzích jednotlivých produktů. Alternativní zápis se stejným výsledkem, který může být použitelný například v některých starších verzích Power Pivotu v Excelu, může vypadat následovně.

Alternativní zápis funkce SELECTEDVALUE:

Syntaxe SELECTEDVALUE alternativní =
IF
(
    HASONEVALUE(<Název sloupce>),
    VALUES(<Název sloupce>),
    [, <Alternativní výsledek>]
)

V roce 2022 byla představena v Power BI nová funkcionalita známa jako Parametr polí. O této funkcionalitě můžete najít více informací v samostatném článku. Funkce HASONEVALUE() a funkce SELECTEDVALUE(), stejně jako některé další funkce, nejsou dostupné pro práci s automaticky vygenerovaným sloupcem vytvořeným právě pro parametr polí (Parameter fields). 

HASONEVALUE a SELECTEDVALUE s Parametrem polí

Jednou z možností, jak obejít toto omezení, je vytvořit si v tabulce vygenerované pro parametr polí nový počítaný sloupec, který bude obsahovat pouze odkaz na první sloupec tabulky, tedy sloupec obsahující názvy jednotlivých parametrů. Následně můžeme tento nový počítaný sloupec použít ve funkcích HASONEVALUE() i SELECTEDVALUE(). V tomto přístupu se pak budeme spoléhat na nepřímé filtrování hodnot v novém počítaném sloupci, který bude kopií původního automaticky vygenerovaného sloupce. 

Další možností je použít kombinaci funkcí, které s Parametrem polí fungují, a umožňují vytvořit podobnou logiku, která je výsledkem funkcí HASONEVALUE() a SELECTEDVALUE(). Uvažujme například následující Parametr polí, obsahující sloupce z tabulky 'Date'.

DAX funkce HASONEVALUE a SELECTEDVALUE 15

Následující dvě měřítka mohou být v některých specifických situacích brána jako náhrada za funkce HASONEVALUE() a SELECTEDVALUE() při práci s automaticky vytvořeným sloupcem obsahujícím názvy jednotlivých parametrů v Parametru polí.

Měřítka:

HASONEVALUE s Parametrem polí =
COUNTROWS(VALUES(Parameter)) = 1
SELECTEDVALUE s Parametrem polí =
IF
(
    COUNTROWS(VALUES(Parameter)) = 1,
    VALUES(Parameter[Parameter])
)

Měřítko [HASONEVALUE s Parametrem polí] vrací hodnotu TRUE, pokud je automaticky vygenerovaná tabulka vytvořená při definici Parametru polí filtrována pouze na jeden řádek. Za povšimnutí stojí, že uvnitř funkce VALUES() musí být v tomto případě odkaz na tabulku, a ne na konkrétní sloupec. Měřítko [SELECTEDVALUE s Paramterem polí] pak vrací název vybraného parametru, opět pokud je tabulka s Parametry polí filtrována pouze na jeden řádek. 

DAX funkce HASONEVALUE a SELECTEDVALUE 16

Pokud vybereme více parametrů nebo žádný parametr, výsledek vypadá podle očekávání následovně.

DAX funkce HASONEVALUE a SELECTEDVALUE 17

Parametr polí je relativně nová funkcionalita. Je tedy možné, že v budoucnu budou funkce HASONEVALUE() i funkce SELECTEDVALUE() fungovat s Parametrem polí standardně. Současně přístupů,  jak nahradit tyto funkce s Parametrem polí může být více, nicméně výše uvedený příklad se mi v době psaní tohoto příspěvku jeví jako nejjednodušší. 

Dále je třeba mít na paměti, že jednotlivé parametry jsou určitá zástupná pole. Pokud například použijeme Parametr polí se sloupci z tabulky 'Date' ve vizuálu Matrix, tak řádky vizuálu netvoří filtr na základě hodnot ve sloupcích tabulky z Parametru polí, ale filtry v jednotlivých řádcích jsou nastaveny na originální sloupce z tabulky 'Date', na které se jednotlivé parametry odkazují.

DAX funkce HASONEVALUE a SELECTEDVALUE 18

Tabulka s Parametry polí by byla filtrována pouze, pokud by uživatel filtroval přímo hodnoty z automaticky vygenerované tabulky pro Parametr polí, v reportu na obrázku výše například pomocí Průřezu. Práce s Parametry polí má proto svá specifika, na která je třeba při psaní DAX výrazů myslet. Příklady měřítek která nahrazují funkce HASONEVALUE() a SELECTEDVALUE() při práci s Parametry polí mohou vracet pro autora neočekávané výsledky, pokud nejsme dobře seznámení se všemi aspekty, které mohou ovlivňovat výsledek měřítek.

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

Komentáře