PowerBI_QuickMeasures_000

Szybkie budowanie miar w Power BI z Quick Measures

Jedną z funkcjonalności dostępnych w jeden z ostatnich aktualizacji Power BI Desktop są tzw. Quick Measures, dosyć ciekawa funkcjonalność wydająca się całkiem użytecznym mechanizmem dlatego też zdecydowałem się poświęcić temu zagadnieniu krótki artykuł.

Quick Measures to nic innego jak możliwość szybkiego generowania miar w języku DAX według określonych reguł. Brzmi kusząco prawda? I tak też jest w rzeczywistości mimo, iż powinniśmy mieć świadomość tego, że wszystko co wygenerowane jest automatycznie jest dalekie od ideału. Pomijając zbędny opis przejdźmy do demonstracji – w moim pliku Power BI Desktop stworzyłem prosty model bazujący na AdventureWorksDW. Nie jest istotne, które tabele są w nim zawarte – do wykonania ćwiczenia wystarczą nam dowolne dane zawierające liczby i jakieś kolumny nadające kontekst. Pierwszym krokiem będzie stworzenie tabeli z wybraną miarą ( w moim przypadku SalesAmount z tabeli faktów InternetSales) oraz atrybutem opisującym (atrybut Color z DimProduct):

Aby stworzyć naszą szybką miarę wystarczy kliknąć prawym przyciskiem myszy na kolumnę którą chcemy wykorzystać i z menu kontekstowego wybrać Quick measures:

Naszym oczom ukaże się okno dialogowe do budowania szybkiej miary – jak możecie zauważyć mamy do dyspozycji naprawdę dużo możliwości – każda z nich ma dosyć intuicyjną, samo opisującą nazwę:

Zbudujmy naszą pierwszą miarę – jako kalkulację wybierzmy Average per Category – następnie jako bazową wartość (ang. Base value) wybierzmy Sum of SalesAmount, a jako kategorię wybierzmy CalendarQuarter:

Po zatwierdzeniu przyciskiem OK stworzona zostanie odpowiednia miara – dodajmy ją do stworzonej wcześniej tabeli:

Nasza tabela przedstawia wartość sprzedaży w kolejnych latach oraz średnią wartość sprzedaży per kwartał w danym roku. Wszystko wygląda naprawdę dobrze – spójrzmy zatem na definicję naszej miary:

Average SalesAmount per CalendarQuarter = 
AVERAGEX(
	KEEPFILTERS(VALUES('Date'[CalendarQuarter])),
	CALCULATE(SUM('InternetSales'[SalesAmount]))
)

Dosyć ciekawy zapis który oblicza sumę SalesAmount dla każdego kwartału, a następnie wyciąga średnią z powstałych sum – oczywiście przy uwzględnieniu bieżącego kontekstu. Funkcja KEEPFILTERS jest trochę nadmiarowa gdyż bez niej stworzona miara działała by dokładnie tak samo. To na co warto zwrócić uwagę to fakt, iż każda miara wygenerowana w taki sposób bardzo często jest mało elastyczna i nie daje tego czego byśmy oczekiwali np. na powyższej wizualizacji możemy zobaczyć, że na podsumowaniu (Grand Total) widnieje liczba 7,339,669.31 – skąd się wziął akurat taki rezultat? Aby się tego dowiedzieć musimy dokładnie zrozumieć jak działa nasza miara co nie zawsze jest trywialnym zadaniem. Liczba ta powstała w następujący sposób:

W pierwszej kolejności posumowane zostały odpowiednie pierwsze,drugie, trzecie i czwarte kwartały – stało się tak ze względu na fakt, iż w naszym modelu kwartały zostały oznaczone zwykła cyfrą tj. 1,2,3 i 4 przez co VertiPaq nie jest w stanie rozróżnić, który kwartał należy do którego roku

Tak więc w pierwszym wierszu liczba 7 488 858.71 oznacza sumę pola Sales Amount dla każdego pierwszego kwartału w każdym roku – podobna suma powstała dla każdego kolejnego kwartału. Z powstałych sum wyciągnięta została średnia, która jest równa właśnie naszej tajemniczej liczbie 7,339,669.31

Aby uniknąć błędnych interpretacji możemy np. ukryć podsumowanie miary na podsumowaniu roku:

Average SalesAmount per CalendarQuarter =
IF (
    DISTINCTCOUNT ( 'Date'[CalendarYear] ) = 1,
    AVERAGEX (
        KEEPFILTERS ( VALUES ( 'Date'[CalendarQuarter] ) ),
        CALCULATE ( SUM ( 'InternetSales'[SalesAmount] ) )
    ),
    BLANK ()
)

Daje nam to nieco lepszy efekt bez mylącego podsumowania:

Wypróbujmy jeszcze jedną Quick measure, a mianowicie Difference from filtered value, którą może okazać się całkiem przydatna w codziennej pracy.Konfiguracja tej miary wygląda następująco:

Tak więc nasza miara pokaże różnice pomiędzy sumą kolumny Order Quantity w danym kontekście, a sumą kolumny Order quantity dla kolumny Color równej Black. Chciałbym w tym miejscu mieć możliwość nie tylko wybrać konkretną wartość pola (Black) ale móc wybrać kilka lub wszystkie wartości.

Wygląda to całkiem dobrze – natomiast miara wykorzystuje opisane wcześniej na tym blogu zmienne i składnię TREATAS:

OrderQuantity difference from Black = 
VAR __BASELINE_VALUE =
	CALCULATE(
		SUM('InternetSales'[OrderQuantity]),
		TREATAS({("Black")}, 'Product'[Color])
	)
RETURN
	SUM('InternetSales'[OrderQuantity]) - __BASELINE_VALUE

Podsumowując Quick Measures jest dosyć fajną opcją jednak należy do niej podchodzić z pewną rezerwą gdyż wygenerowany kod nie jest idealny, a już z całą pewnością można go traktować jako uniwersalne narzędzie pozwalające nam uniknąć nauki DAX 🙂 Ponadto sama funkcjonalność jest dosyć ograniczona – chociażby dlatego, że gdy chcemy w niektórych miarach zaznaczyć kilka wartości lub wszystkie to takiej możliwości nie mamy. Ogólnie rzecz biorąc funkcjonalność ma potencjał ale w kolejnych aktualizacjach Power BI powinna być znacznie ulepszona pod kątem funkcjonalnym. Myślę, że tak się stanie szczególnie, że na portalu http://ideas.powerbi.com/ zgłoszonych jest całkiem dużo pomysłów na rozbudowanie konceptu – trzymam kciuki!

2 Comments

  1. “….a już z całą pewnością można go traktować jako uniwersalne narzędzie pozwalające nam uniknąć nauki DAX…” – chyba z całą pewnośćią NIE MOŻNA 🙂

Leave a Reply