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?
-
Utworzyć model gdzie użytkownik będzie mógł wybrać dwa okresy czasu
-
Utworzyć miary w DAX, aby policzyć wartości dla obydwóch okresów
-
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?
-
Utworzyć model gdzie użytkownik będzie mógł wybrać dwa okresy czasu
-
Utworzyć miary w DAX, aby policzyć wartości dla obydwóch okresów
-
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.