Ukazovateľ za predchádzajúci týždeň v jazyku DAX, v PowerPivote a Power BI

V predchádzajúcom článku sme si ukázali, ako správne vypočítať daný ukazovateľ za rovnaký týždeň pred rokom. Niekedy však potrebujete porovnávať tento týždeň voči predchádzajúcemu týždňu. Preto si teraz ukážeme, ako vypočítať ukazovateľ za predchádzajúci týždeň, resp. week-over-week, v jazyku DAX.

Riešenie bude veľmi podobné tomu, aké sme použili v predchádzajúcom článku. Ak ste ho ešte nečítali, tak si ho pred čítaním tohto článku prečítajte.

Riešenie si opäť ukážeme na našom vzorovom súbore PowerPivotu, resp. Power BI.

Spravíme si kontingenčku, kde:

  1. do oblasti hodnôt dáme merítko Obrat z tabuľky Objednávky,
  2. do oblasti riadkov dáme stĺpce CalendarYear a WeekNumberOfYear z tabuľky Čas.

Výsledná kontingenčka bude vyzerať takto:

A po rozkliknutí prvého a druhého roku, a nastavení sa na ich prelom, to bude vyzerať takto:

A teraz by sme chceli vypočítať ukazovateľ za predchádzajúci týždeň. V tomto konkrétnom prípade použijeme ako ukazovateľ toto merítko Obrat. A dopomôžeme si k tomu technikou indického zápisu filtrov a premennými.

Ako vypočítať ukazovateľ za predchádzajúci týždeň

Na to, aby sme to vedeli vypočítať, budeme musieť opäť upraviť kontext výpočtu merítka Obrat. Konkrétne tak, že posunieme kontext výpočtu na predchádzajúci týždeň. To spravíme tak, že upravíme filtre kontextu výpočtu tak, aby každé jedno políčko videlo na predchádzajúci týždeň voči svojmu týždňu. Tam môžu nastať 2 prípady:

  1. ak je číslo týždňa väčšie ako 1, tak iba znížime číslo týždňa vo filtri,
  2. ak je číslo týždňa 1, tak musíme posunúť kontext výpočtu na posledný týždeň v predchádzajúcom roku.

V tom druhom prípade však máme drobný problém, pretože každý rok nemá rovnaký počet týždňov. V závislosti od toho, ako počítate čísla týždňov, môže byť v danom roku od 51 do 53 týždňov. A ak by sme mali zahrnúť túto logiku do výpočtu, tak by sme zbytočne spomalili vzorec, a zbytočne duplikovali logiku, ktorú už máme v časovej tabuľke. Kde už predsa tie čísla týždňov máme vypočítané. Preto v tomto druhom prípade spravíme to, že nastavíme filtre kontextu výpočtu tak, že:

  1. hodnotu filtra nad rokom znížime o 1,
  2. hodnotu filtra nad týždňom nastavíme na maximálnu hodnotu čísla týždňa v predchádzajúcom roku.

Vytvoríme teda nové merítko s názvom “Obrat za predchádzajúci týždeň”, a výsledný vzorec bude takýto:

Obrat za predchádzajúci týždeň :=
VAR aktualnyTyzden = SELECTEDVALUE ( 'Čas'[WeekNumberOfYear] )
VAR rok =
    IF (aktualnyTyzden > 1;
        SELECTEDVALUE ( 'Čas'[CalendarYear] );
        SELECTEDVALUE ( 'Čas'[CalendarYear] ) - 1
    )
VAR tyzden =
    IF (aktualnyTyzden > 1;
        aktualnyTyzden - 1;
        CALCULATE ( MAX ( 'Čas'[WeekNumberOfYear] );
                    ALL ( 'Čas'[WeekNumberOfYear] ); 'Čas'[CalendarYear] = rok
        )
    )
RETURN
    CALCULATE ([Obrat]; 'Čas'[CalendarYear] = rok; 'Čas'[WeekNumberOfYear] = tyzden)

Po dosadení do kontingenčky dostaneme správny výsledok:

Ukazovateľ za predchádzajúci týždeň v jazyku DAX, v PowerPivote a Power BI

A ako to funguje?

Najprv si do premennej aktualnyTyzden uložíme hodnotu filtra nad stĺpcom WeekNumberOfYear, čiže číslo aktuálne počítaného týždňa, pomocou funkcie SELECTEDVALUE. Potom si vypočítame hodnotu roka a týždňa, ktoré použijeme v závere vzorca vo funkcii CALCULATE ako filtrovacie hodnoty. Filtrovaciu hodnotu pre rok uložíme do premennej s názvom rok. Výpočet premennej je podľa jednoduchej logiky – ak je aktuálny týždeň väčší ako 2, tak použi hodnotu aktuálneho roku (hodnotu z filtra CalendarYear), inak použi hodnotu “aktuálny rok – 1”. Pretože v tomto druhom prípade to znamená, že sme v prvom týždni, a ak chceme vypočítať daný ukazovateľ za predchádzajúci týždeň, tak musíme dostať do predchádzajúceho roku.

Potom nasleduje výpočet filtrovacej hodnoty pre týždeň, do premennej s názvom tyzden. Tam použijeme tie 2 podmienky uvedené vyššie – ak je aktuálny týždeň väčší ako 1, tak do tejto premennej uložíme hodnotu “aktualnyTyzden – 1”. V opačnom prípade – ak je aktuálny týždeň rovný 1 – musíme zistiť posledné číslo týždňa v predchádzajúcom roku. Predchádzajúci rok už máme vypočítaný v premennej rok. Využijeme teda základné vlastnosti kontextu výpočtu, a pomocou funkcie CALCULATE ho vypočítame. Najprv zrušíme pomocou funkcie ALL filter nad stĺpcom WeekNumberOfYear, aby sme “videli” na všetky týždne. Potom pomocou indického zápisu filtrov – “‘Čas'[CalendarYear] = rok” – prepíšeme hodnotu filtra nad rokom na predchádzajúci rok (vypočítaný v premennej rok). Tým pádom budeme vidieť na všetky týždne v predchádzajúcom roku. V takomto novom kontexte výpočtu vypočítame maximum zo stĺpca ‘Čas'[WeekNumberOfYear]. Čo je číslo posledného týždňa v predchádzajúcom roku, ktoré sme hľadali.

Ako to dokončiť

Nakoniec už iba na konci celého vzorca, vo funkcii CALCULATE, dáme vypočítať merítko Obrat. V kontexte, kde indickými zápismi filtrov prepíšeme filtre nad stĺpcami CalendarYear a WeekNumberOfYear na vypočítané hodnoty v premenných. To spôsobí zmenu kontextu výpočtu na predchádzajúci týždeň, a keď v takomto novom kontexte dáme vypočítať merítko Obrat, tak dostaneme Obrat za predchádzajúci týždeň.

Takto jednoducho teda ide vypočítať ľubovoľný ukazovateľ za predchádzajúci týždeň. Prípadne aj za iné obdobia. Obdobia sú zvyčajne len inými filtrami, a ich úpravou sa viete posúvať po rôznych obdobiach. Máme síce aj funkcie Time Intelligence, ale tie podporujú len niekoľko základných scenárov, ako roky, štvrťroky, mesiace a dni. Týždne, či nebodaj pracovné dni a rôzne iné vlastné obdobia však nepodporujú. A dokonca nefungujú ani v režime DirectQuery. To vás však už nemusí trápiť, keď ovládate aspoň základy práce s kontextom výpočtu. A takéto vzorce sú pre vás potom už hračkou 🙂