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
Syntaxe funkce HASONEVALUE:
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:
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ů.
Pokud v průřezu vybereme pouze jednu podkategorii produktů, výsledkem měřítka [HASONEVALUE Subcategory] bude hodnota TRUE.
Pokud v průřezu vybereme více podkategorií, výsledkem bude opět hodnota FALSE.
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ě.
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ě.
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:
Nové měřítko můžeme vložit do vizuálu Matrix, s roky, měsíci a dny v řádcích vizuálu.
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:
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.
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
Syntaxe funkce SELECTEDVALUE:
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.
Měřítko:
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ě.
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.
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.
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
Počítaná tabulka:
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.
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:
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.
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:
Výsledek měřítka [Vyřazený model barva] si můžeme pro ověření funkčnosti zobrazit v použitém vizuálu.
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ě.
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:
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í
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'.
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:
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.
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í.
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.
https://docs.microsoft.com/cs-cz/dax/hasonevalue-function-dax
https://docs.microsoft.com/cs-cz/dax/selectedvalue-function
Komentáře
Okomentovat