PowerBI_BLOG#5

Porównywanie dwóch różnych okresów

Porównywanie różnych okresów czasu to jedne z najczęściej wymaganych funkcjonalności w modelach. Funkcje czasu takie jak skumulowana suma, czy identyczny okres rok temu są najczęściej wymagane w jakichkolwiek rozwiązaniach BI. Ponadto coraz częściej użytkownicy zgłaszają potrzebę dowolności w formułowaniu okresów porównawczych. Jak temu zaradzić jeśli chcemy za pomocą dwóch fragmentatorów daty porównywać różne (nawet nieidentyczne) okresy czasu?
Najlepiej opisze to poniższy obraz:
Jak krok po kroku utworzyć takie rozwiązanie?
  1. Utworzyć model gdzie użytkownik będzie mógł wybrać dwa okresy czasu
  2. Utworzyć miary w DAX, aby policzyć wartości dla obydwóch okresów
  3. Sprowadzić wartości do wspólnego mianownika
Pierwszym krokiem jest utworzenie tabeli kalendarzowej. Możemy to zrobić na wiele sposobów, na potrzeby tego ćwiczenia niech to będzie:
Calendar=
CALENDAR(
MIN(financials[Date]),
MAX(financials[Date])
)
Następnym krokiem jest utworzenie tożsamej tabeli kalendarzowej do filtrowania porównywanego okresu:
PrevCalendar=
ALLNONBLANKROW('Calendar')
Następnie musimy nawiązać relacje pomiędzy tymi tabelami i ręcznie ją dezaktywować. Sprawi to, że relacja nie będzie wpływała na obliczenia dopóki nie aktywujemy jej formułą.. Model powinien wyglądać jak poniżej:
Następnie utworzymy miary sumujące wartości Sales.
_Current Sales =
SUM(financials[Sales])
_Previous Sales =
CALCULATE(
    [_Current Sales],
    ALL('Calendar'),
    USERELATIONSHIP(
      'Calendar'[Date],PrevCalendar[Date]
    )
)
Celowo używamy funkcji ALL, aby pozbyć się filtrów nałożonych na tabelę Calendar. Następnie aktywujemy relacje pomiędzy tabelami Calendar, a PrevCalendar. Efektem tego będzie możliwość filtrowania wyników przy użyciu tabeli PrevCalendar.  Używając teraz dwóch miar jesteśmy w stanie pokazać wartości faktyczne, które wystąpiły w badanym okresie.
Pozostaje nam policzyć jaki jest współczynnik zmiany, aby znormalizować wyniki. W tym celu wykorzystamy współczynnik wynikający z różnicy dni pomiędzy zaznaczonymi okresami casu, tzn. dokonamy dzielenia pomiędzy liczbą dni okresu głównego (G), a liczbą dni okresu porównawczego (P). Miara będzie wyglądać następująco:
_Wspolczynnik=
DIVIDE(
COUNTROWS('Calendar'),
COUNTROWS('PrevCalendar')
)
Następnie poprawimy miarę _Previous Sales:
_Previous Sales =
CALCULATE(
[_Current Sales],
ALL('Calendar'),
USERELATIONSHIP(
'Calendar'[Date],PrevCalendar[Date]
)
)*[_Wspolczynnik]
Wykorzystując współczynnik zmiany wartości w końcu są do siebie porównywalne. Obrazuje to zrzut ekranu poniżej:
Rozwiązanie nie jest trudne do zaimplementowania. Zawsze planuje je przy budowie modelu danych i tworząc miary zawsze upewniam się, że pozwalają one na dokonywanie tych samych obliczeń w dwóch wybranych okresach. Oszczędza to później dodatkowej pracy przy wdrażaniu nowej zmiany.

Porównywanie dwóch różnych okresów

Porównywanie różnych okresów czasu to jedne z najczęściej wymaganych funkcjonalności w modelach. Funkcje czasu takie jak skumulowana suma, czy identyczny okres rok temu są najczęściej wymagane w jakichkolwiek rozwiązaniach BI. Ponadto coraz częściej użytkownicy zgłaszają potrzebę dowolności w formułowaniu okresów porównawczych. Jak temu zaradzić jeśli chcemy za pomocą dwóch fragmentatorów daty porównywać różne (nawet nieidentyczne) okresy czasu?
Najlepiej opisze to poniższy obraz:
Jak krok po kroku utworzyć takie rozwiązanie?
  1. Utworzyć model gdzie użytkownik będzie mógł wybrać dwa okresy czasu
  2. Utworzyć miary w DAX, aby policzyć wartości dla obydwóch okresów
  3. Sprowadzić wartości do wspólnego mianownika
Pierwszym krokiem jest utworzenie tabeli kalendarzowej. Możemy to zrobić na wiele sposobów, na potrzeby tego ćwiczenia niech to będzie:
Calendar=
CALENDAR(
MIN(financials[Date]),
MAX(financials[Date])
)
Następnym krokiem jest utworzenie tożsamej tabeli kalendarzowej do filtrowania porównywanego okresu:
PrevCalendar=
ALLNONBLANKROW('Calendar')
Następnie musimy nawiązać relacje pomiędzy tymi tabelami i ręcznie ją dezaktywować. Sprawi to, że relacja nie będzie wpływała na obliczenia dopóki nie aktywujemy jej formułą.. Model powinien wyglądać jak poniżej:
Następnie utworzymy miary sumujące wartości Sales.
_Current Sales =
SUM(financials[Sales])
_Previous Sales =
CALCULATE(
    [_Current Sales],
    ALL('Calendar'),
    USERELATIONSHIP(
      'Calendar'[Date],PrevCalendar[Date]
    )
)
Celowo używamy funkcji ALL, aby pozbyć się filtrów nałożonych na tabelę Calendar. Następnie aktywujemy relacje pomiędzy tabelami Calendar, a PrevCalendar. Efektem tego będzie możliwość filtrowania wyników przy użyciu tabeli PrevCalendar.  Używając teraz dwóch miar jesteśmy w stanie pokazać wartości faktyczne, które wystąpiły w badanym okresie.
Pozostaje nam policzyć jaki jest współczynnik zmiany, aby znormalizować wyniki. W tym celu wykorzystamy współczynnik wynikający z różnicy dni pomiędzy zaznaczonymi okresami casu, tzn. dokonamy dzielenia pomiędzy liczbą dni okresu głównego (G), a liczbą dni okresu porównawczego (P). Miara będzie wyglądać następująco:
_Wspolczynnik=
DIVIDE(
COUNTROWS('Calendar'),
COUNTROWS('PrevCalendar')
)
Następnie poprawimy miarę _Previous Sales:
_Previous Sales =
CALCULATE(
[_Current Sales],
ALL('Calendar'),
USERELATIONSHIP(
'Calendar'[Date],PrevCalendar[Date]
)
)*[_Wspolczynnik]
Wykorzystując współczynnik zmiany wartości w końcu są do siebie porównywalne. Obrazuje to zrzut ekranu poniżej:
Rozwiązanie nie jest trudne do zaimplementowania. Zawsze planuje je przy budowie modelu danych i tworząc miary zawsze upewniam się, że pozwalają one na dokonywanie tych samych obliczeń w dwóch wybranych okresach. Oszczędza to później dodatkowej pracy przy wdrażaniu nowej zmiany.

Interesujący artykuł? Podaj dalej!