DAX je funkcionální jazyk, ve kterém při použití více funkcí vnořujeme jednotlivé funkce do sebe. Kdykoliv analyzujeme DAX kód, který obsahuje více vnořených funkcí, můžeme začít od nejvnitřnější funkce a postupovat směrem od středu k dalším vnějším funkcím. Jedinou výjimkou jsou funkce CALCULATE() a CALCULATETABLE().
Pořadí vyhodnocení filtrů ve funkci CALCULATE
Měřítka:
Výsledkem obou měřítek je suma prodejů kol ve fiskálním roce 2018, samozřejmě s ohledem na případný vnější kontext, ve kterém mohou být měřítka vyhodnocena.
Pořadí vyhodnocení argumentů ve funkci CALCULATE
Syntaxe funkce CACLULATE:
První argument je povinný, a jedná se o výraz, který má být vyhodnocen. Dalšími argumenty jsou filtry, které jsou nepovinné a může jich být neomezený počet. Filtry jsou ve funkci CALCULATE() vyhodnoceny jako první v pořadí. Po sestavení nového kontextu filtru spolu s případnými vnějšími filtry dojde k vyhodnocení výrazu, který je uveden jako první argument funkce CALCULATE().
Měřítko:
Ve funkci VALUES() je uveden odkaz na sloupec obsahující názvy barev. Díky filtru nastavenému na jednu barvu máme jistotu, že VALUES() bude vracet tabulku s jedním řádkem a jedním sloupcem, která bude převedena automaticky na skalární hodnotu. Pokud bychom při analýze výše uvedeného kódu postupovali jako u všech ostatních DAX výrazů - tedy od nejvnitřnější funkce směrem k vnějším funkcím, pravděpodobně bychom řekli, že výsledkem bude černá barva.
Jak bylo uvedeno dříve, při analýze funkcí CALCULATE() a CALCULATETABLE() musíme postupovat jinak, než u všech ostatních funkcí v jazyku DAX. Funkce CALCULATE() nejdříve vyhodnotí filtry, sestaví nový kontext filtru spolu se všemi vnějšími a vlastními filtry, a až následně dojde k vyhodnocení prvního argumentu funkce - výrazu který se má spočítat. Správná interpretace výše uvedeného kódu je proto následující.
Proč filtr ve vnitřní funkci CALCULATE přepíše vnější filtry
Měřítko:
Logické filtry jsou ve funkci CALCULATE() vždy na pozadí při vyhodnocení přepsány do podoby tabulky. Zápis uvedený výše odpovídá původnímu měřítku. Došlo pouze k rozepsání filtrů do podoby, jak jsou ve skutečnosti interpretovány na pozadí při vyhodnocení měřítka.
Jak je možné vidět na obrázku výše, obě měřítka vrací stejnou hodnotu. Dalším důležitým poznatkem, kromě pořadí vyhodnocení argumentů ve funkci CALCULATE() je, že filtry ve funkci CALCULATE() jsou vždy na pozadí přepsané do podoby tabulky. Tato tabulka je pak před vyhodnocením prvního argumentu ve funkci CALCULATE() přeměněna do podoby filtru, který je aplikován na celý model.
Shrnutí
Pochopení pořadí vyhodnocení argumentů ve funkci CALCULATE() je velmi důležité a může výrazně usnadnit práci se složitějšími výrazy, které obsahují několik vnořených funkcí a mezi kterými mohou být i funkce CALCULATE() nebo CALCULATETABLE(). Funkce CALCULATE() může v některých situacích vracet neočekávané výsledky. Tomu se můžeme vyhnout, pokud se seznámíme se všemi vlastnostmi funkcí, které používáme. Následně velmi brzy zjistíme, že vše funguje správně a psaní DAX výrazů se stane jednodušší.
Komentáře
Okomentovat