Plánovacie týždne a práca s nimi v jazyku DAX (Power BI, PowerPivot)

Pri práci s kalendárnymi týždňami máme častokrát problém, ako vykazovať ukazovatele na prelome rokov. Takmer nikdy nespadne začiatok týždňa na začiatok roka, a štatistika za takéto týždne sa rozdelí do 2 rokov. Ako štandardné riešenie sa namiesto toho používa vykazovanie, kde použijeme plánovacie týždne a roky, ktoré týmto neduhom netrpia. A na to sa teraz pozrieme podrobnejšie.

Na demonštráciu opäť použijeme náš vzorový súbor Power BI, resp. PowerPivotu. Vytvoríme si kontingenčnú tabuľ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”, “WeekNumberOfYear” a “DateKey”.

To nám vytvorí kontingenčku, kde budeme mať zobrazené obraty po rokoch, týždňoch a dátumoch. Keď si kontingenčku rozklikneme na prelom rokov 2001 a 2002, až na dátumy, tak to bude vyzerať takto:

Kalendárne týždne v Power BI a PowerPivote, v jazyku DAX

Poznámka: naša vzorová databáza má predpočítané čísla týždňov podľa amerických týždňov, ktoré začínajú v nedeľu, a nie v pondelok. Dátum 30.12.2001 je nedeľa.

Tam vidíte hlavný problém vykazovania po týždňoch. Keďže sme použili kalendárne týždne, predpočítané v stĺpci “WeekNumberOfYear”, tak sa nám štatistika za ten týždeň na prelome rokov rozdelila do oboch rokov, podľa toho v ktorom roku bol daný dátum. Keď však potrebujeme vykazovať po týždňoch, tak údaje z jedného týždňa potrebujeme mať – úplne nečakane – v jednom týždni pokope. Aby sme napríklad vedeli porovnať susedné týždne, či vykonať iné výpočty po týždňoch.

Väčšina ľudí to rieši tak, že oželie presnú štatistiku na prelome rokov. Veď vo väčšine firiem predsa nie je veľa aktivity počas koncoročných sviatkov, takže sa to nejako “zakecá” a po sviatkoch pokračuje život ďalej. Čo však, keď práve naša firma je jedna z tých, ktorá má vysokú aktivitu, ak nie najvyššiu počas roka, práve počas prelomu rokov? Ako napríklad e-shopy, hotely, banky či logistika? V tom prípade to musíme spraviť poriadne.

Riešenie je celkom jednoduché. Stačí použiť plánovacie týždne podľa ISO normy ISO8601, ktorá bola vytvorená ako štandardizované riešenie tohto problému. Podľa tejto normy sa počítajú a priraďujú čísla týždňov k jednotlivým dátumom tak, aby každý jeden týždeň mal vždy 7 dní, a zároveň patril vždy do jedného roka. To je zabezpečené pomocou pravidla, že ak 1. január spadá na pondelok až štvrtok, tak spadá do 1. plánovacieho týždňa v roku. Ak spadá na piatok až nedeľu, tak patrí do posledného plánovacieho týždňa predchádzajúceho plánovacieho roka. Podobne sú odvodené aj čísla plánovacích rokov.

Konkrétny výpočet si tu nebudeme ukazovať, pretože ho nájdete v našej ultimátnej časovej tabuľke pre Power Query. Tam sú už vypočítané stĺpce “Rok ISO” a “Týždeň ISO”, kde sú pre každý deň v analyzovanej histórii predpočítané čísla príslušných plánovacích rokov a týždňov. Takže si už iba stačí pridať takúto tabuľku cez Power Query, upravenú na roky v našich dátach (v tomto prípade 2001 – 2004), a v dátovom modeli ju prepojiť cez dátumový stĺpec na hlavnú tabuľku s transakciami. V našom prípade túto tabuľku nazveme “UCT” a prepojíme ju cez stĺpec “Dátum” na tabuľku “Objednávky” na stĺpec “SaleDateKey”.

Potom stačí už len poskladať novú kontingenčku takýmto spôsobom:

  1. do oblasti hodnôt dáme merítko “Obrat” z tabuľky “Objednávky”,
  2. do oblasti riadkov dáme stĺpce “Rok ISO”, “Týždeň ISO” a “Dátum” z tabuľky “UCT”.

To nám opäť vytvorí kontingenčku, kde budeme mať zobrazené obraty po rokoch, týždňoch a dátumoch. Tentokrát však po plánovacích rokoch a týždňoch namiesto kalendárnych. Keď si kontingenčku rozklikneme na prelom rokov 2001 a 2002, až na dátumy, tak to bude vyzerať takto:

Plánovacie týždne v Power BI a PowerPivote, v jazyku DAX

Tam už vidíte, že každý týždeň má presne 7 dní. Dátum 31.12.2001 (pondelok) spadá podľa hore uvedených pravidiel do plánovacieho roku 2002. A najmä nemáme rozbitý jeden týždeň na zopár dní v roku 2001 a zvyšok v roku 2002. Takto sa robí následné vykazovanie po týždňoch úplne jednoducho. Takisto ako aj následné výpočty, ako napríklad porovnanie týždňa s rovnakým týždňom pred rokom:

Obrat pred rokom =
CALCULATE([Obrat], UCT[Rok ISO] = SELECTEDVALUE(UCT[Rok ISO]) - 1)

Čo nám dá takýto výsledok:

Plánovacie týždne, porovnanie, v Power BI a PowerPivote, v jazyku DAX

Takto teda viete vyriešiť problém s celistvosťou týždňov na prelome rokov. Riešením sú plánovacie týždne podľa ISO normy. Takto už nemusíte riešiť problém so štatistikou po týždňoch na prelome rokov. Plánovacie týždne to poľahky vyriešia za vás.