Kumulativní součet (RT) v DAX

Kumulativní součet (RT) v DAX

Tento příspěvek obsahuje příklad výpočtu kumulativního součtu přes celé období. Příklady s výpočty kumulativních součtů v rámci let (YTD), čtvrtletní (QTD) a měsíců (MTD) můžete najít v samostatném příspěvku.

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

Kumulativní součet v jazyku DAX (Running total)

V prvním kroku si vytvoříme měřítko se sumou prodejů z tabulky Sales. Měřítko [Prodeje] bude vracet sumu prodejů v aktuálním kontextu vyhodnocení.

Měřítko:

Prodeje = SUM(Sales[Sales Amount])

Měřítko [Prodeje] si vložíme do vizuálu Matrix, spolu s roky a měsíci v řádcích. Výchozí report může vypadat následovně.

Kumulativní součet (RT) v DAX 2

Pokud se podíváme na hodnotu měřítka [Prodeje] na úrovni jednotlivých měsíců, měřítko vrací sumu prodejů, který vždy odpovídá prodejům v daném měsíci. Měřítko kumulativních prodejů by pak mělo vracet pro každý měsíc sumu prodejů za aktuální měsíc a za všechny předcházející měsíce.

Kumulativní prodeje

K výpočtu kumulativních prodejů potřebujeme upravit kontext, ve kterém je měřítko [Prodeje] vyhodnoceno. Měřítko prodejů proto vložíme do funkce CALCULATE(), a následně přidáme filtr, který bude obsahovat všechny dny, které jsou menší nebo rovny maximálnímu dni dostupnému v aktuálním kontextu vyhodnocení. Pokud máme správně naformátovanou datumovou tabulku a tuto tabulku máme v modelu označenou jako tabulku kalendářních dat, výpočet může vypadat následovně.

Měřítko:

Prodeje RT =
CALCULATE
(
[Prodeje],
'Date'[Date] <= MAX('Date'[Date])
)

Nově definované měřítko můžeme vložit do dříve připraveného vizuálu.

Kumulativní součet (RT) v DAX 3

Měřítko [Prodeje RT] vrací pro každý měsíc sumu prodejů za aktuální měsíc a všechny předcházející měsíce. Například v měsíci srpen 2017 představuje hodnota měřítka [Prodeje RT] součet prodejů za měsíce červenec 2017 a srpen 2017, a tak dále, až po poslední dostupný měsíc v datumové tabulce.

Kumulativní součet (RT) v DAX 4

Při pohledu na obrázek výše můžeme vidět, že ve výpočtu ještě potřebujeme ošetřit, aby měřítko [Prodeje RT] nezobrazovalo hodnoty pro budoucí dny, ve kterých ještě nedošlo k žádným prodejům.

V použitém modelu jsou k dispozici data za prodané produkty pouze do 15. června 2020. Za tento den si v reálném a pravidelně aktualizovaném modelu můžeme dosadit aktuální den, pro který máme k dispozici data. Jednou z nejjednodušších možností, jak ošetřit zobrazování měřítka [Prodeje RT] pouze pro relevantní dny, je zobrazovat toto měřítko pouze v případě, kdy v aktuálním kontextu vyhodnocení máme k dispozici záznamy o prodejích.

Měřítko:

Prodeje RT (skryté budoucí jednoduché) =
IF
(
[Prodeje] > 0,
CALCULATE
(
[Prodeje],
'Date'[Date] <= MAX('Date'[Date])
)
)

Měřítko [Prodeje RT (skryté budoucí jednoduché)] v prvním argumentu funkce IF() vyhodnocuje, zda v aktuálním kontextu vyhodnocení existují nějaké prodeje. Pokud je měřítko [Prodeje] v aktuálním kontextu vyhodnocení větší než 0, pak se vyhodnotí výpočet kumulativních prodejů v druhém argumentu funkce IF(). V opačném případě bude výsledná hodnota měřítka [Prodeje RT(skryté budoucí jednoduché)] vracet prázdnou hodnotu BLANK().

Kumulativní součet (RT) v DAX 5

Jak je možné vidět na obrázku výše, měřítko [Prodeje RT (skryté budoucí jednoduché)] vrací výsledek pouze pro měsíce, ve kterých došlo k prodejům produktů.

Jiný způsob ošetření zobrazování výsledku výpočtu kumulativních prodejů pouze v relevantní dny může vypadat následovně.

Měřítko:

Prodeje RT (skryté budoucí) =
VAR MaxDate = DATE(2020,6,15)
--VAR MaxDate = TODAY()
--VAR MaxDate = TODAY() - 1
--VAR MaxDate = CALCULATE(MAX(Sales[Order Date]), REMOVEFILTERS())
VAR MinDateAktualniKontext = MIN('Date'[Date])

VAR Vysledek =
IF
(
MinDateAktualniKontext <= MaxDate,
CALCULATE
(
[Prodeje],
'Date'[Date] <= MAX('Date'[Date])
)
)
RETURN
Vysledek

Ve výše uvedeném výpočtu si nejdříve do proměnné MaxDate uložíme maximální datum, pro které chceme výpočet zobrazit. Toto datum je ve výpočtu uvedeném výše definováno staticky jako konstanta. V reálném a pravidelně aktualizovaném modelu bychom maximální datum určili dynamicky. Některé možnosti, jak definovat maximální datum, pro které chceme hodnoty zobrazit, jsou uvedeny v zakomentovaných řádcích v definici měřítka. Jakmile máme k dispozici poslední dostupný den, zbývá ve funkci IF() ověřit, zda je minimální den v aktuálním kontextu vyhodnocení (proměnná MinDateAktualniKontext)  menší nebo roven maximálnímu dni celkem (proměnná MaxDate). Pokud je podmínka splněna, výsledkem výpočtu bude kumulativní suma prodejů. Pokud podmínka splněna není, výsledkem bude prázdná hodnota BLANK().

Kumulativní součet (RT) v DAX 6

K výše uvedenému jednoduchému příkladu zbývá doplnit důležitou poznámku, která se týká obecně práce s datumovou tabulkou. Při výpočtu kumulativních součtů nastavujeme filtry ve funkci CALCULATE() na sloupec 'Date'[Date], který obsahuje jedinečné hodnoty ve  formátu DATE a patří do tabulky označené jako "tabulka kalendářních dat". Tento předpoklad je nezbytný pro definici všech předchozích výpočtů počítajících kumulativní součty. Pokud by tato podmínka nebyla splněna, museli bychom do filtrů funkce CALCULATE() přidat funkci REMOVEFILTERS() s argumentem ve formě datumové tabulky pro dosažení požadovaného výsledku. 

Jelikož je v použitém modelu datumová tabulka správně naformátovaná a je označena jako tabulka kalendářních dat, dojde při vyhodnocení výpočtu kumulativních prodejů na pozadí k automatickému odstranění všech předchozích filtrů aplikovaných na tabulku 'Date'

Některé další příklady časových kalkulací můžete najít na stránce DAX - Příklady.

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

Komentáře