Funkce SUM() a funkce SUMX() jsou dvě jednoduché funkce, se kterými se můžeme velmi často setkat při psaní DAX výpočtů. Pokud si nejste jistí, jaký je rozdíl mezi těmito funkcemi a kdy ve výpočtu použít funkci SUM() a kdy funkci SUMX(), tento příspěvek by Vám mohl pomoci.
Rozdíl mezi funkcí SUM a funkcí SUMX v jazyku DAX
Příklady uvedené v tomto příspěvku jsou vytvořeny ve cvičném Power BI souboru Adventure Works DW 2020.pbix, soubor s řešením je dostupný ke stažení níže pod tímto příspěvkem.
Funkce SUM
Syntaxe funkce SUM():
Funkce SUM(), nebo obecně sumarizační funkce, ignorují kontext řádku, ale výsledek funkce ovlivňuje v době vyhodnocení aktivní kontext filtru, který je přirozenou součástí Power BI reportů. Jako příklad si můžeme ve cvičném Power BI souboru vytvořit následující měřítko.
Měřítko:
Nové měřítko můžeme vložit do vizuálu tabulky. Pokud v době vyhodnocení měřítka není v modelu aktivní žádný filtr, výsledkem měřítka je suma všech hodnot ze sloupce uvedeného v argumentu funkce SUM().
Podívejme se například na první řádek tabulky. V tomto řádku je při vyhodnocení měřítka tabulka 'Sales' filtrovaná pouze na prodané produkty, které patří do kategorie Bikes. V prvním řádku tabulky proto výsledek měřítka odpovídá sumě za prodané produkty v kategorii Bikes. Ve druhém řádku jde o sumu za prodané produkty v kategorii Components, a tak dále. V řádku souhrnů nepůsobí při vyhodnocení měřítka na model žádný filtr, a výsledkem je proto suma za všechny prodané produkty, bez ohledu na kategorii produktů. Pokud do reportu přidáme další filtr, například pomocí průřezu, tento filtr opět ovlivní výsledek měřítka [Prodeje].
Na výpočet měřítka nyní působí při jeho vyhodnocení další filtr, který filtruje tabulku 'Sales' pouze na prodeje uskutečněné v roce 2019. V prvním řádku tabulky tak měřítko [Prodeje] vrací sumu za prodané produkty v kategorii Bikes za rok 2019, a tak dále.
Funkce SUMX
Syntaxe funkce SUMX():
Před použitím funkce SUMX() bychom vědět, že:
- Tabulka v prvním argumentu funkce je vyhodnocena v originálním kontextu vyhodnocení, tedy v kontextu, ve kterém je vyhodnocena samotná funkce SUMX().
- Výraz ve druhém argumentu funkce je vyhodnocen v originálním kontextu vyhodnocení a současně v nově vytvořeném kontextu řádku, který je tvořen tabulkou v prvním argumentu funkce.
Začněme ale jednoduchým příkladem, který bude vracet stejnou hodnotu, jako dříve vytvořené měřítko [Prodeje], pouze místo funkce SUM() použijeme funkci SUMX().
Měřítko:
Jako první argument je ve výše uvedeném měřítku použita tabulka 'Sales', která bude vyhodnocena v originálním kontextu, který bude obsahovat všechny případné filtry v reportu, ve kterém je měřítko vyhodnoceno. Druhým argumentem je odkaz na sloupec právě z tabulky 'Sales'. Tento sloupec obsahuje jednotlivé částky za prodané produkty. Výsledkem měřítka [Prodeje SUMX] tak bude suma všech částek za prodané produkty, nicméně pouze z těch řádků tabulky 'Sales', které budou dostupné v aktuálním kontextu vyhodnocení. Výsledek můžeme vidět na následujícím obrázku, i s porovnáním s dříve vytvořeným měřítkem [Prodeje], ve kterém jsme použili funkci SUM().
Jak je možné vidět na obrázku výše, výsledek obou měřítek je stejný. Všechny výpočty které zvládneme vytvořit pomocí funkce SUM(), můžeme vytvořit také pomocí funkce SUMX(). Na druhou stranu funkce SUMX() umožňuje vytvořit daleko komplexnější výpočty. Uvažujme například opět sumu za prodané produkty. Tento sloupec je u každého záznamu v tabulce 'Sales' vypočítán jako násobek počtu prodaných produktů a ceny produktu. Cena produktu se ještě může lišit v závislosti na poskytnuté slevě. Pokud bychom neměli tento výpočet již k dispozici v tabulce a chtěli bychom ho získat pomocí měřítka, mohli bychom postupovat následujícím způsobem.
Měřítko:
Výsledek můžeme vidět na následujícím obrázku.
Výsledek obou měřítek je opět stejný, pouze jsme logiku výpočtu, která je skrytá pod hodnotami ve sloupci 'Sales'[Sales Amount], aplikovali na výpočet v měřítku pomocí funkce SUMX(). Ve druhém argumentu funkce SUMX() můžeme přistupovat také k hodnotám ze sloupců z tabulek, které jsou s tabulkou použitou v prvním argumentu funkce ve vztahu MANY-TO-ONE na straně ONE.
Pomocí funkce RELATED() tak například můžeme do výpočtu zahrnout sloupec z tabulky 'Product', který obsahuje náklady na výrobu produktu, a vypočítat tak hrubý zisk.
Měřítko:
Nové měřítko si opět můžeme zobrazit ve vizuálu, spolu s měřítkem [Prodeje].
V další části si ještě můžeme ukázat příklad špatně definovaného měřítka, které bychom mohli s dobrým úmyslem vytvořit v případě, kdy nejsme dobře seznámeni s principem kontextu řádku a s principem kontextu filtru.
Nevhodné použití funkce SUM
Měřítko:
Než se podíváme na výsledek měřítka [Prodeje špatně] v reportu, vytvořme si ještě pro porovnání měřítko se správným výpočtem.
Měřítko:
Výsledek obou měřítek můžeme vidět na následujícím obrázku.
Měřítko [Prodeje špatně] vrací mnohonásobně vyšší částky, než které skutečně firma utržila za prodané produkty. Problém takto definovaného měřítka je v granularitě, ve které je výpočet vyhodnocen. Uvažujme například první řádek vizuálu na obrázku výše, tedy řádek s kategorií Bikes. V měřítku [Prodeje špatně] násobíme sumu všech jednotkových cen všech produktů z dané kategorie sumou všech množství opět všech produktů z dané kategorie, které byly prodány. Jinak řečeno, pokud násobíme sumu jinou sumou, tak je výsledek jiný než součty jednotlivých násobků na nejnižší úrovni detailu. Velmi zjednodušeně, 2 * 2 + 2 * 2 není totéž, jako 4 * 4. Měřítko [Prodeje špatně] by vracelo správné výsledky pouze v granularitě dané tabulkou 'Sales'. Tu si můžeme v reportu nasimulovat tak, že vložíme do vizuálu primární klíč z tabulky 'Sales', namísto kategorií produktů.
Na obrázku výše je v řádcích vizuálu použitý primární klíč z tabulky 'Sales'. Pouze v takto vytvořeném pohledu vrací měřítko [Prodeje špatně] stejné hodnoty, jako měřítko [Prodeje správně], kromě řádku souhrnů. Naproti tomu měřítko [Prodeje správně] vrací správné výsledky i v situacích, kdy potřebujeme výsledek vyhodnotit na nižší úrovni.
V měřítku [Prodeje správně] je granularita dána tabulkou, kterou jsme použili v prvním argumentu funkce SUMX(). Případné vnější filtry sice působí na tuto tabulku uvedenou v prvním argumentu, nicméně samotný výpočet je vyhodnocen vždy řádek po řádku, i když v tabulce, která je zafiltrovaná například pouze na konkrétní rok, kategorii, nebo kterýkoliv jiný atribut z dimenzních tabulek.
Shrnutí
Oficiální Microsoft dokumentace funkcí SUM a SUMX:
https://docs.microsoft.com/cs-cz/dax/sum-function-dax
https://docs.microsoft.com/cs-cz/dax/sumx-function-dax
Komentáře
Okomentovat