Pokaż Top X wartości i skategoryzuj pozostałe w Power BI

W tym artykule, przedstawię jak w Power BI wyświetlić wartość sprzedaży dla najlepszych X produktów, a resztę skategoryzować jako „Other” (pozostałe). To często spotykana potrzeba biznesowa. Spójrzmy jak używając modelowania w DAX i kilku prostych miar jesteśmy w stanie zwizualizować wymagane obliczenia.

Wymagania

Podsumujmy wpierw jakie wymagania muszą zostać spełnione:
  • Wyświetlenie nazw produktów wraz z grupą pozostałych na osi X.
  • Wbudowanie fragmentatora używanego do wyboru top X produktów.
  • Formatowanie warunkowe do podświetlenia wartości sprzedaży produktów i Other.
  • Dynamiczny tytuł pokazujący % udział w sprzedaży całkowitej produktów z grupy Top.

Wyświetlanie produktów i grupy pozostałych produktów na jednej osi

W naszym scenariuszu musimy przedstawić nazwy produktów wraz z kategorią pozostałych na poziomej osi wykresu. Możemy to wykonać mając kolumnę z listą produktów zawierającą dodatkowy rekord „Other”. Utwórzmy tabelę DAX zgodnie z poniższym:
dNProduct =
UNION(
DISTINCT ( dProduct[ProductName]), -- unikalne produkty
DATATABLE ( -- dodatkowy wiersz określający resztę
"Product", STRING,
{{"Other"}}
)
)
Utwórzmy relację między tabelą produktów, a nowoutworzoną tabelą:

Kolejnym krokiem będzie utworzenie miary, która odpowiednio przeliczy wartość sprzedaży dla TOP 3 produktów.
_Top N Sum Sales =
CALCULATE (
[C_SalesAmount], -- moja miara wartości sprzedaży dla aktualnego okresu
KEEPFILTERS (
TOPN (
3,
ALLSELECTED( dNProduct ),
[C_SalesAmount]
)
)
)
Nałóżmy teraz naszą miarę na matrycę, aby zaprezentować wynik.

Jak widać to jeszcze nie to co chcieliśmy osiągnąć. Następnym krokiem będzie utworzenie zestawienia top 3 produktów i dołożenie do nich wartości pozostałych produktów zgrupowanych w kategorii „Other”. Nasza miara powinna wyglądać jak poniżej.
_Top N Sum Sales =
VAR _TopProdTable =
TOPN (
3,
ALLSELECTED ( dNProduct ),
[C_SalesAmount]
)
VAR _TopProdSales =
CALCULATE (
[C_SalesAmount],
KEEPFILTERS ( dNProduct )
)

VAR _OtherSales =
CALCULATE (
[C_SalesAmount],
ALLSELECTED ( dNProduct )
)
- CALCULATE ( -- odejmowanie wartości sprzedaży top 3 produktów
[C_SalesAmount],
_TopProdTable
)

VAR _CurrentProd =
SELECTEDVALUE ( dNProduct[ProductName] )

RETURN
IF ( -- kategoryzacja top produktów i pozostałych
_CurrentProd <> "Other",
_TopProdSales,
_OtherSales
)
Nasza matryca będzie wyglądać następująco:

Wymaganie spełnione! Przejdźmy teraz dalej.

Wbudowanie fragmentatora używanego do wyboru top X produktów

Kolejnym krokiem będzie zmiana stałej wartości top 3 produktów na zmienną, którą wybierzemy od jednego do pięciu najlepiej sprzedających się produktów, a resztę skategoryzujemy jako Other. Utworzymy w tym celu tabelę TopN Selection według poniższego kodu.
TopN Selection =
{1,2,3,4,5}
Następnie utworzymy fragmentator zawierający utworzoną kolumnę. Teraz pozostaje nam przerobić naszą miarę Top N Sum Sales tak, aby uwzględniała użycie zmiennej ilości topowych produktów.
Top N Sum Sales =
VAR _TopNSelected =
SELECTEDVALUE( 'TopN Selection'[Value] )

VAR _TopProdTable =
TOPN(
_TopNSelected,
ALLSELECTED( dNProduct ),
[C_SalesAmount]
)

VAR _TopProdSales =
CALCULATE(
[C_SalesAmount],
KEEPFILTERS( _TopProdTable )
)

VAR _OtherSales =
CALCULATE(
[C_SalesAmount],
ALLSELECTED( dNProduct )
)

- CALCULATE(
[C_SalesAmount],
_TopProdTable
)

VAR _CurrentProd=
SELECTEDVALUE( dNProduct[ProductName] )
RETURN
IF(
_CurrentProd<>"Others",
_TopProdSales,
_OtherSales
)
Po przerobieniu naszej matrycy na wykres i dodaniu fragmentatora osiągniemy poniższy efekt.

Przejdźmy do kolejnego zadania.

Formatowanie warunkowe do podświetlenia wartości sprzedaży produktów i Other

Aby oznaczyć innym kolorem najlepsze produkty i kategorię pozostałych posłużymy się miarą i formatowaniem warunkowym. Zacznijmy najpierw od miary.
TopNColor =
SWITCH(
SELECTEDVALUE( dNProduct[ProductName] ), -- wybrany produkt
"Other", "#117D40", -- w przypadku innych wybierz zielony (oznaczony kodem HEX)
"#F1C917" -- w innym przypadku wybierz żółty (HEX)
)
Aby zaaplikować miarę jako formatowanie warunkowe przejdź do ustawienia formatowania wykresu, następnie wybierz Data Color i naciśnij przycisk fx, aby wywołać okno formatowania warunkowego. W oknie formatowania warunkowego wybierz format by field i kolejno miarę TopNColor. Wynik powinien wyglądać jak poniżej.

Przejdźmy do ostatniego kroku.

Dynamiczny tytuł pokazujący % udział w sprzedaży całkowitej produktów z grupy Top

Aby utworzyć dynamiczny tytuł, który przedstawi procentowy udział wybranych produktów w sprzedaży musimy utworzyć miarę.
TopNTitle =
VAR _TopProd =
CALCULATE (
[C_SalesAmount],
TOPN (
SELECTEDVALUE( 'TopN Selection'[Value] ),
ALLSELECTED( dNProduct[ProductName] ),
[C_SalesAmount]
)
)

VAR _TopProdPct=
DIVIDE (
_TopProd,
[C_SalesAmount]
)

RETURN
"Top "
& SELECTEDVALUE( 'TopN Selection'[Value] ) & " products made "
& FORMAT (
_TopProdPct,
"#.0% Sales"
)
Następnie wstawimy pole tekstowe (textbox), w którym w polu tytułu użyjemy funkcji klikając fx i wybierając utworzoną powyżej miarę. Spójrzmy na nasze rozwiązanie na poniższym zrzucie ekranu.

Gotowe! Mam nadzieję, że udało Wam się dobrnąć do końca rozwiązania i otrzymać identyczny wynik. Jeśli uważasz, że można poprawić to rozwiązanie podziel się pomysłem w komentarzu.
Do ćwiczenia wykorzystałem przykładową bazę danych AdventureWorks. Możesz ją pobrać stąd.

Interesujący artykuł? Podaj dalej!