DAX funkce CONCATENATE a CONCATENATEX

Syntaxe DAX funkce CONCATENATEX

Funkce CONCATENATE() spojí hodnoty zadané v prvním a druhém argumentu funkce do jednoho textového řetězce. CONCATENATE() přijímá pouze dva argumenty. Pokud potřebujeme zřetězit více hodnot, můžeme buď vnořit více funkcí CONCATENATE() do sebe, nebo můžeme použít operátor "&", což je jednodušší a častěji využívaná varianta. 

Další funkce určená ke spojení více hodnot do jednoho textového řetězce je funkce CONCATENATEX(). Funkce CONCATENATEX() je iterační funkce, která přijímá jako první argument tabulku. Druhý argument funkce CONCATENATEX() je výraz, který je vyhodnocen v každém řádku tabulky zadané v prvním argumentu funkce, a výsledek tohoto výrazu z každého řádku tabulky je zřetězen do jednoho textového řetězce. Pomocí funkce CONCATENATEX() tak můžeme zřetězovat hodnoty, které jsou v různých řádcích tabulky nebo můžeme zřetězovat výrazy vyhodnocené vyhodnocené v kontextu řádku tabulky v prvním argumentu této funkce. Výsledek můžeme dále ovlivňovat pomocí dalších nepovinných argumentů, které jsou určené pro seřazení jednotlivých hodnot ve finálním textovém řetězci.

Příklady v tomto příspěvku jsou vytvořeny ve cvičném Power BI souboru Adwenture Works DW 2020.pbix, soubor s řešením je dostupný ke stažení níže pod tímto příspěvkem.

Příklad CONCATENATE

Funkce CONCATENATE() přijímá dva argumenty, ve kterých můžeme použít jakýkoliv výraz vracející skalární hodnotu.

Syntaxe funkce CONCATENATE:

CONCATENATE(<text1>, <text2>)

Ve funkci CONCATENATE() můžeme jako argumenty používat měřítka, odkazy na sloupce, konstanty nebo jakékoliv jiné výrazy, které vracejí skalární hodnotu. Zadané argumenty jsou po vyhodnocení převedeny na text a spojeny do jednoho textového řetězce. Typickým příkladem použití funkce CONCATENATE() je spojení dvou hodnot ze dvou sloupců v každém řádku tabulky. Uvažujme například tabulku 'Reseller'. Každý prodejce má v této tabulce uložené mimo jiné město, ve kterém sídlí, a poštovní směrovací číslo.

DAX funkce CONCATENATE a CONCATENATEX

Pokud bychom chtěli hodnoty ze sloupců 'Resseler'[City] a 'Resseler'[Postal Code] spojit do jednoho nového počítaného sloupce, můžeme použít následující výpočet.

Počítaný sloupec:

Město a PSČ (Concatenate) = CONCATENATE(Reseller[City], Reseller[Postal Code])

Výsledek nového počítaného sloupce můžeme vidět ve čtvrtém sloupci na následujícím obrázku.

DAX funkce CONCATENATE a CONCATENATEX 2

Pokud spojujeme více textových řetězců do jednoho, obvykle mezi jednotlivé hodnoty vkládáme také oddělovač, například čárku a mezeru. Funkce CONCATENATE() ale přijímá pouze dva argumenty. Pokud bychom chtěli spojit dva textové řetězce do jednoho a ty oddělit například pomlčkou - tedy dalším textovým řetězcem, můžeme použít následující výraz.

Počítaný sloupec:

Město a PSČ (Concatenate 2) =
CONCATENATE
(
    CONCATENATE(Reseller[City]," - "),
    Reseller[Postal Code]
)

Ve výše uvedeném výrazu jsou vnořeny dvě funkce CONCATENATE() do sebe. Vnitřní CONCATENATE() vrací název města a pomlčku. Tento výsledek je pak použit jako první argument ve vnější funkci CONCATENATE(), kde je spojen s hodnotou poštovního směrovacího čísla.

DAX funkce CONCATENATE a CONCATENATEX 3

Velké omezení funkce CONCATENATE() je právně v počtu přijímaných argumentů. Obvykle je proto jednodušší spojovat textové řetězce pomocí operátoru "&". Předchozí výpočet nového počítaného sloupce tak může být nahrazen následujícím výrazem.

Počítaný sloupec:

Město a PSČ (Operátor &) = Reseller[City] & " - " & Reseller[Postal Code]

Výsledek je v každém řádku tabulky 'Reseller' stejný, jako v případě použití vnořených funkcí CONCATENATE().

DAX funkce CONCATENATE a CONCATENATEX 4

Funkce CONCATENATE() je jednoduchá funkce a může být snadno nahrazena operátorem &. Zajímavější pak může být funkce CONCATENATEX(), díky které můžeme zřetězovat hodnoty z různých řádků tabulky v jednom kroku.

Příklad CONCATENATEX

Než přistoupíme k příkladu použití funkce CONCATENATEX(), podívejme se nejdříve na syntaxi této funkce.

Syntaxe funkce CONCATENATEX:

Syntaxe CONCATENATEX =
CONCATENATEX
(
    <tabulka>,
    <výraz>
    [, <oddělovač>
    [, <seřaditPodle_výraz>
    [, <způsobŘazení>]]...]
)

První dva argumenty jsou povinné, ostatní jsou volitelné. Tabulka v prvním argumentu je vyhodnocena v originálním kontextu, ve kterém je funkce použita. V prvním argumentu pak můžeme použít tabulku nebo také funkci vracející tabulku. Druhý argument funkce CONCATENATEX() je vyhodnocen v kontextu řádku tabulky uvedené v prvním argumentu. Ve druhém argumentu se proto můžeme odkazovat přímo na sloupce v tabulce uvedené v prvním argumentu funkce, nebo můžeme použít jakýkoliv výpočet, který bude vyhodnocen v kontextu řádku tabulky v prvním argumentu a bude vracet skalární hodnotu. Výsledkem funkce bude textový řetězec, který se skládá z výsledků výrazu uvedeného ve druhém argumentu funkce v každém řádku tabulky uvedené v prvním argumentu. Volitelně můžeme přidat ve třetím argumentu oddělovač jednotlivých výsledků výrazu. Dále můžeme zadat výraz, podle kterého budou hodnoty ve druhém argumentu seřazeny a vybrat způsob řazení. Různé způsoby použití funkce CONCATENATEX() si ukážeme na konkrétních příkladech.

Na následujícím obrázku je zachycen Power BI vizuál Matrix, ve kterém jsou v řádcích tabulky názvy modelů a v hodnotách suma za prodané produkty v dané modelové řade.

DAX funkce CONCATENATE a CONCATENATEX 5

Každá modelová řada obsahuje jeden nebo více produktů, které se mohou prodávat ve více barevných variantách. Do vizuálu si tak můžeme přidat měřítko, které bude vracet počet barev, ve kterých se prodávají produkty v dané modelové řadě.

Měřítko:

Počet barev = COUNTROWS(VALUES('Product'[Color]))

Měřítko [Počet barev] vrací v každém řádku vizuálu podle očekávání počet barev, ve kterých se prodávají produkty v dané modelové řadě.

DAX funkce CONCATENATE a CONCATENATEX 6

Pokud bychom vypsat v měřítku přímo názvy barev, namísto počtu, použijeme právě funkci CONCATENATEX().

Měřítko:

Barvy =
CONCATENATEX
(
    VALUES('Product'[Color]),
    'Product'[Color],
    ", "
)

V prvním argumentu funkce CONCATENATEX() je tabulka obsahující barvy produktů v aktuálním kontextu vyhodnocení. Ve druhém argumentu funkce je odkaz na sloupec z tabulky v prvním argumentu funkce. Hodnoty z tohoto sloupce budou spojeny do jednoho textového řetězce a mezi jednotlivé barvy bude vložen oddělovač uvedený ve třetím argumentu funkce CONCATENATEX().

DAX funkce CONCATENATE a CONCATENATEX 7

Jak můžeme vidět na obrázku výše, měřítko [Barvy] vrací jednotlivé barvy v náhodném pořadí. Pokud bychom chtěli mít barvy seřazené abecedně, můžeme upravit výpočet a přidat čtvrtý a pátý argument.

Měřítko:

Barvy (Řazení ASC) =
CONCATENATEX
(
    VALUES('Product'[Color]),
    'Product'[Color],
    ", ",
    'Product'[Color],
    ASC
)

Ve čtvrtém argumentu, který ve kterém se uvádí výraz určený pro seřazení výsledku, je uveden odkaz na stejný sloupec s barvami produktů, jako ve druhém argumentu funkce. Výsledek tedy bude seřazen abecedně podle názvu barev. V pátém argumentu pak můžeme zvolit způsob řazení – ASC vzestupně, DSC – sestupně.  V aktualizované verzi výpočtu jsou názvy barev v každé buňce seřazeny abecedně.

DAX funkce CONCATENATE a CONCATENATEX 8

Seřadit jednotlivé barvy můžeme i podle jiné hodnoty. Můžeme tak například vytvořit seznam barev s pořadím od barvy s největšími tržbami po nejnižší.

Měřítko:

Barvy (Řazení podle prodejů) =
CONCATENATEX
(
    VALUES('Product'[Color]),
    'Product'[Color],
    ", ",
    [Prodeje],
    DESC
)

Nyní budou barvy seřazeny podle sumy za prodané produkty v dané barvě, od nejvyšší sumy po nejnižší. Výsledek nového měřítka si opět můžeme zobrazit v původním vizuálu.

DAX funkce CONCATENATE a CONCATENATEX 9

Jak můžeme vidět na obrázku výše, řazení barev se  u některých modelů změnilo, protože barvy jsou nyní seřazeny podle sumy za prodané produkty v dané barvě, od nejvyšších prodejů po nejnižší.

Ve druhém argumentu funkce CONCATENATEX() můžeme použít také jiný výraz než odkaz na sloupec z tabulky v prvním argumentu funkce. Můžeme si tak například přidat ke každé barvě sumu za prodané produkty v této barvě.

Měřítko:

Barvy a prodeje =
CONCATENATEX
(
    VALUES('Product'[Color]),
    'Product'[Color] &
    " (" & FORMAT([Prodeje],"#,##0.00", "cs-cz") & ")",
    ", ",
    [Prodeje],
    DESC
)

Výsledek pak bude vypadat následovně.

DAX funkce CONCATENATE a CONCATENATEX 10

Nyní je u každé barvy uvedena částka za prodané produkty právě v dané barvě a modelové řadě. Sečtením hodnot zobrazených u každé barvy dostaneme sumu za prodané produkty v dané modelové řadě, která je výsledkem měřítka [Prodeje] v prostředním sloupci. Pokud se produkty v dané modelové řadě prodávají pouze v jedné barvě, jak je tomu například u modelu "Road-150", hodnota měřítka [Prodeje] je shodná s hodnotou uvedenou u této jediné barvy.

Shrnutí

Funkce CONCATENATE() a CONCATENATEX() jsou dvě různé funkce s různými způsoby použití. Funkce CONCATENATE() spojí dva textové řetězce do jednoho, a může být snadno nahrazena operátorem &. Pomocí operátoru & pak můžeme spojovat libovolné množství textových řetězců a můžeme se tak vyhnout vnořování funkcí CONCATENATE() do sebe. Funkce CONCATENATEX() je velmi užitečná v situacích, kdy potřebujeme spojit do jednoho textového řetězce hodnoty uvedené v různých řádcích tabulky anebo hodnoty, které jsou výsledkem výrazu vyhodnoceného v kontextu řádku tabulky uvedené v prvním argumentu této funkce. 

Oficiální Microsoft dokumentace funkce CONCATENATE a CONCATENATEX:
https://docs.microsoft.com/cs-cz/dax/concatenate-function-dax
https://docs.microsoft.com/cs-cz/dax/concatenatex-function-dax

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

Komentáře