DAX funkce CALCULATE s USERELATIONSHIP

Úvodní obrázek

USERELATIONSHIP() je funkce pro úpravu filtrů ve funkci CALCULATE(), díky které můžeme manipulovat s relacemiPokud mezi dvěma tabulkami existuje více relací, může být v jednu chvíli aktivní pouze jedna z nich. Použitím funkce USERELATIONSHIP() změníme neaktivní relaci na aktivní a původní relaci dočasně zneaktivníme.

Příklad USERELATIONSHIP

V souboru Adventure Works DW 2020 Power BI Desktop Sample jsou mezi tabulkou 'Sales' a tabulkou 'Date' tři relace. Aktivní je relace nastavená mezi sloupci 'Sales'[OrderDateKey] a 'Date'[DateKey].

DAX funkce CALCULATE s USERELATIONSHIP 2

V příkladu uvedeném v tomto příspěvku budeme pracovat s měřítkem [Prodeje], které má následující definici.

Měřítko:

Prodeje = SUM(Sales[Sales Amount])

Pokud přidáme do Power BI reportu tabulku s fiskálními roky v řádcích, a do hodnot vložíme měřítko, které počítá sumu prodejů z tabulky 'Sales', výsledek může vypadat následovně.

DAX funkce CALCULATE s USERELATIONSHIP 3

Hodnota měřítka [Prodeje] v prvním řádku tabulky zobrazuje sumu hodnot ze sloupce 'Sales'[Sales Amount], které odpovídají filtru pro fiskální rok 2018. Tento filtr prochází přes aktivní relaci, která je nastavena mezi tabulkami 'Sales' a 'Date' přes sloupce 'Sales'[OrderDateKey] a 'Date'[DateKey]. Hodnota měřítka [Prodeje] v prvním řádku tedy nemusí odpovídat sumě utržené za prodané produkty, ale jedná se o sumu hodnot jednotlivých objednávek v daném roce. Pokud bychom pro výpočet chtěli použít neaktivní relaci, která je nastavena mezi sloupci 'Sales'[DueDateKey] a 'Date'[DateKey], můžeme použít funkci USERELITONSHIP().

DAX funkce CALCULATE s USERELATIONSHIP 4

Funkce USERELATIONSHIP() se používá jako modifikátor funkce CALCULATE(). USERELATIONSHIP() má dva povinné argumenty - názvy sloupců představující neaktivní relaci, kterou chceme aktivovat. Při výpočtu výrazu v prvním argumentu funkce CALCULATE() pak bude pro výpočet použita relace aktivovaná funkcí USERELATIONSHIP(). Relace, která je nastavena jako aktivní v modelu, bude pro tento výpočet dočasně deaktivována.

Měřítko:

Prodeje podle data splatnosti =
CALCULATE
(
SUM(Sales[Sales Amount]),
USERELATIONSHIP('Sales'[DueDateKey],'Date'[DateKey])
)

Výsledek může vypadat následovně.

DAX funkce CALCULATE s USERELATIONSHIP 5

Na obrázku výše je vidět rozdíly mezi výsledky měřítek [Prodeje]  a [Prodeje podle data splatnosti]. Rozdíl je dán tím, že většina objednávek v tabulce 'Sales' má odložené datum splatnosti.

Další důležitou vlastností všech modifikátorů filtrů v CALCULATE() je, že jsou vyhodnoceny před všemi ostatními explicitními filtry. Explicitními filtry rozumíme filtry definované uvnitř funkce CALCULATE().

Měřítko:

Prodeje datum splatnosti 2018 =
CALCULATE
(
    SUM(Sales[Sales Amount]),
    'Date'[Fiscal Year] = "FY2018",
    USERELATIONSHIP('Sales'[DueDateKey],'Date'[DateKey])
)

Filtr uvedený v měřítku výše je nastavený na fiskální rok 2018. Protože jsou modifikátory v CALCULATE() vyhodnoceny přednostně, tak tento filtr využívá při vyhodnocení relaci definovanou ve funkci USERELATIONSHIP(). Výsledek měřítka proto odpovídá v každém řádku tabulky sumě prodejů ve fiskálním roce 2018, právě podle data splatnosti.

DAX funkce CALCULATE s USERELATIONSHIP 6

Jak je vidět na předcházejícím obrázku, filtr nastavený ve funkci CALCULATE() na fiskální rok 2018 je opravdu vyhodnocen až po aktivovaní relace vytvořené na základě datumu splatnosti.

Shrnutí

Funkce USERELATIONSHIP() může pro výpočet uvedený ve funkci CALCULATE() aktivovat relaci, která je v modelu nastavena jako neaktivní. Tato funkcionalita je výhodná především v situacích, kdy mezi dvěma tabulkami existují vztahy založené na hodnotách z více různých sloupců. Nemusíme tak duplikovat filtrovací tabulku, ale ve výpočtu můžeme neaktivní relaci aktivovat právě pomocí funkce USERELATIONSHIP().

č. 15

Komentáře