Filtry dnů a časové kalkulace v jazyku DAX

Filtry dnů a časové kalkulace v jazyku DAX

Tento článek obsahuje jeden z možných postupů použitelných pro ošetření filtrů na úrovni dnů při tvorbě časových kalkulací v jazyku DAX. Příklad je vytvořen ve cvičném Power BI souboru Adventure Works DW 2020.pbix. Odkaz na stažení souboru s řešením je uveden níže pod tímto příspěvkem.

K tomuto tématu je k dispozici také video:

(Aktualizováno 30. 12. 2023)

Časové kalkulace a filtry na úrovni dnů

Problém při práci s časovými kalkulacemi a filtry na úrovni dnů si můžeme znázornit na jednoduchém příkladu. V použitém Power BI souboru si nejdříve vytvoříme dvě měřítka. Měřítko [Prodeje] vrací sumu za prodané produkty v aktuálním kontextu vyhodnocení. Měřítko [Prodeje předchozí měsíc (jednoduché)] vrací sumu za prodané produkty v předchozím měsíci. 

Pro časový posun je v měřítku [Prodeje předchozí měsíc (jednoduché)] použita funkce DATEADD(), která běží na pozadí mnoha dalších Time intelligence funkcí, a je proto vhodným kandidátem pro obecné znázornění problému při práci s filtry na úrovni dnů.

Měřítka:

Prodeje = SUM(Sales[Sales Amount])

Prodeje předchozí měsíc (Jednoduché) =
CALCULATE
(
    [Prodeje],
    DATEADD('Date'[Date], -1, MONTH)
)

Funkce DATEADD() načte všechny dny v aktuálním kontextu vyhodnocení, a vrátí dny za stejné období posunuté o jeden měsíc zpět. To si můžeme ověřit při pohledu na následující obrázek, kde jsou obě nová měřítka ve vizuálu Matice, spolu s roky a měsíci v řádcích vizuálu.

Filtry dnů a časové kalkulace v jazyku DAX 2

Pokud se zaměříme na hodnotu měřítka [Prodeje předchozí měsíc (jednoduché)] v kterémkoliv jednom řádku tabulky na úrovni měsíců, můžeme vidět, že hodnota měřítka odpovídá přesně hodnotě měřítka [Prodeje] v předcházejícím měsíci na předcházejícím řádku. 

Situace se ale změní, pokud přidáme do reportu Průřez se dny v týdnů a v tomto Průřezu vybereme pouze určité dny, například dny od pondělí do pátku.

Filtry dnů a časové kalkulace v jazyku DAX 3

Pokud se nyní podíváme na výsledek měřítka [Prodeje předchozí měsíc (jednoduché)] a porovnáme hodnoty v kterémkoliv měsíci s hodnotami měřítka [Prodeje] v měsíci předcházejícím, můžeme vidět, že částky se již neshodují. Měřítko [Prodeje předchozí měsíc (jednoduché)] vrací někdy větší a někdy menší hodnotu, než měřítko [Prodeje] v předcházejícím řádku vizuálu. 

Problémů při filtrování konkrétních dnů je více. Zaprvé, filtrováním konkrétních dnů již neporovnáváme souvislé období obsahující celé měsíce nebo celé roky, ale porovnáváme nesouvislé období. Tím narážíme na problém, kterým je různá délka měsíců. Pokud totiž pracujeme s celými měsíci, Time intelligence funkce s různou délkou měsíců počítají a vrací očekávané výsledky za celé porovnávané období, v našem příkladu za celé měsíce, bez ohledu na jejich délku z pohledu počtu dnů. Filtrováním konkrétních dnů v týdnu již ale tuto vestavěnou funkcionalitu ztrácíme. 

Dalším problémem s filtry dnů v kombinaci s časovými kalkulacemi je samotný posun konkrétního dne do předcházejícího nebo následujícího období, v našem příkladu do předcházejícího měsíce. Tento problém je znázorněn na následujícím obrázku. Pokud se zaměříme na kterýkoliv konkrétní den, například na 2. prosinec 2017, tak tento den připadá na sobotu. Při posunu o měsíc zpět se dostaneme k datu 2. listopad 2017, a tento den již připadá na čtvrtek.

Filtry dnů a časové kalkulace v jazyku DAX 4

Problému je tedy více, nicméně řešení je v porovnání s popisem celého problému relativně jednoduché. Stačí vytvořit ve funkci CALCULATE() dva samostatné filtry. První filtr bude obsahovat všechny dny v předcházejícím měsíci a bude ignorovat filtry nastavené na dny v týdnu v průřezu. Druhý filtr bude obsahovat filtr dnů v týdnu, které jsou vybrány v průřezu.

Měřítko:

Prodeje předchozí měsíc (Filtry dnů) =
VAR VybraneDnyVTydnu =
    VALUES('Date'[Den])
VAR DnyPredchoziMesic =
    CALCULATETABLE
    (
        DATEADD('Date'[Date], -1, MONTH),
        REMOVEFILTERS('Date'[Den],'Date'[Den číslo])
    )
VAR Vypocet =
    CALCULATE
    (
        [Prodeje],
        DnyPredchoziMesic,
        VybraneDnyVTydnu
    )
RETURN
    Vypocet

Nové měřítko si můžeme vložit do původního vizuálu a zobrazit si výsledek.

Filtry dnů a časové kalkulace v jazyku DAX 5

Jak můžeme vidět na obrázku výše, nová verze výpočtu prodejů za předcházející měsíc již vrací správné výsledky i v případě, kdy jsou v průřezu vybrány konkrétní dny v týdnu. Stejný postup je možné aplikovat i na některé další Time intelligence výpočty při současném filtrování konkrétních dnů, ať už se jedná o dny v týdnu, pracovní dny, svátky atd. Vždy ale musíme dávat pozor na to, které funkce používáme, jak jsou tyto funkce vyhodnoceny v aktuálním kontextu vyhodnocení a jaký je vlastně požadovaný výsledek našeho výpočtu.

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

Komentáře