Jedną z najważniejszych funkcjonalności związanych z raportowaniem w ogóle jest formatowanie warunkowe. Wyświetlanie odpowiednich kolorów czy też znaków w zależności od stanu określonej miary lub kolumny pojawia się w wymaganiach biznesowych niezwykle często ze względu na łatwość użycia i interpretacji. Nie inaczej jest również w przypadku naszego ulubionego narzędzia raportowego jakim jest Power BI, gdzie formatowanie warunkowe oczywiście zostało zaimplementowane i jest ciągle rozbudowywane. Jeśli jednak w konkretnym scenariuszu wbudowane możliwości nam nie wystarczają to możemy bez żadnego problemu je rozszerzyć. Do tego celu użyjemy funkcji języka DAX o nazwie UNICHAR, która to zwracaja określony znak z tablicy UNICODE. Czy aby tego dokonać musimy stworzyć jakieś skomplikowane struktury? Oczywiście, że nie! Postaram się to przedstawić na kilku prostych przykładach.
Do prezentacji funkcjonalności użyłem modelu bazującego oczywiście na AdventureWorksDW, który prezentuje się w następujący sposób:
Wyobraźmy sobie sytuację gdzie mamy sprzedaż dla każdego roku i chcielibyśmy w łatwy sposób zobrazować czy rok do roku odnotowaliśmy wzrost czy też spadek. Wydaje się, że jest to scenariusz niezwykle popularny i prędzej czy później każdy na niego w jakiejś formie napotka. Na samym początku tworzymy sobie zatem tabelę, która pokaże nam rok oraz sumę na polu FactInternetSales[OrderQuantity]:
W dalszym kroku tworzymy w DAX miarę, która zwróci nam wartość z poprzedniego roku (w porównaniu do bieżącego). Do tego celu wykorzystamy jedną z funkcji Time Intelligence o nazwie PARALLELPERIOD, która zwróci nam poprzedni do bieżącego rok. Całość umieścimy w CALCULATE modyfikując kontekst wspomnianą wcześniej funkcją w następujący sposób:
SumOfOrderQty_PY = CALCULATE ( SUM ( [OrderQuantity] ); PARALLELPERIOD ( 'DimDate'[FullDateAlternateKey]; -1; YEAR ) )
Pamiętamy oczywiście, że korzystając z funkcji Time Intelligence powinniśmy oznaczyć tabelę kalendarza jako datę (więcej tutaj). Po dodaniu nowej miary do naszej tabeli możemy zweryfikować jej poprawność:
Wygląda na to, że wszystko działa zgodnie z oczekiwaniami – w dalszej kolejności zmienimy również nazwę miary na Qty PY abyśmy wiedzieli co tak naprawdę ona zwraca. Myślę również, że na ten moment podsumowanie nie jest nam w tej chwili potrzebne więc możemy go wyłączyć:
W dalszej kolejności odejmiemy wartość poprzedniego roku od roku bieżącego osiągając dzięki temu różnicę rok do roku:
Sum Of Order Qty CY_PY = SUM(FactInternetSales[OrderQuantity])-[SumOfOrderQty_PY]
Przedstawiony rezultat jest tym co chcieliśmy osiągnąć dlatego też możemy przejść do użycia wspomnianej wcześniej funkcji UNICHAR. Funkcja ta przyjmuje tylko jeden parametr, którym jest liczba całkowita odpowiadająca znakowi który chcemy wyświetlić. Odpowiedni kod możemy znaleźć w sieci np. tutaj. W naszym przykładzie użyjemy następujących kodów:
- 9650
- 9660
- 9644
Co one oznaczają? Zobrazujemy to za chwilę na przykładzie. Miara którą posłużymy się do wyświetlenia odpowiednich znaków prezentuje się w następujący sposób:
CM = IF ( [Sum Of Order Qty CY_PY]; IF ( [Sum Of Order Qty CY_PY] > 0; UNICHAR ( 9650 ); IF ( [Sum Of Order Qty CY_PY] < 0; UNICHAR ( 9660 ); UNICHAR ( 9644 ) ) ) )
Najpierw sprawdzamy czy miara obliczająca różnicę rok do roku jest pusta – jeśli nie to przejdziemy do dalszych obliczeń, jeśli tak to zwrócona zostanie wartość pusta tj. BLANK. W dalszej kolejności jeśli wartość rok do roku jest większa niż 0 to wyświetlimy znak 9650, jeśli mniejsza niż 0 to 9660, a jeśli równa to 9644. Po przeciągnięciu na tabelę rezultat prezentuje się w następujący sposób:
Otrzymaliśmy zatem symbol przedstawiający zmienność stworzonej wcześniej miary. Teraz nie pozostaje nic innego jak go “pokolorować” w odpowiedni sposób. Aby tego dokonać wystarczy kliknąć prawym przyciskiem myszy na miarę i z menu kontekstowego wybrać Conditional formatting -> Font Color:
Definicja formatowania warunkowego w prezentowanym przykładzie sprowadza się do podania koloru zielonego dla wartości powyżej 0, czerwonego poniżej 0 i czarnego dla wartości równej zero:
W rezultacie otrzymaliśmy ładnie wyglądający KPI:
Stosunkowo niewielkim wysiłkiem osiągnęliśmy zamierzony efekt. Oczywiście jeśli chcielibyśmy zamiast trójkątów mieć inne kształty to nic nie stoi na przeszkodzie i moglibyśmy ich użyć, a przeglądając dostępne znaki naprawdę jest w czym wybierać.
To oczywiście nie koniec możliwości użycia UNICHAR, w kolejnym przykładzie przedstawię jak graficznie zwizualizować ranking. W naszym scenariuszu chcemy za pomocą znaku graficznego pokazać sprzedaż produktów o określonym kolorze tj. jeśli dany kolor najlepiej się sprzedaje to chcemy wyświetlić przy nim jedną gwiazdkę odpowiadającą miejscu pierwszemu, drugi najlepszy produkt powinien mieć wyświetlone dwie gwiazdki itp.
Miara obliczająca ranking wygląda w następujący sposób:
Number Of Stars = VAR vValue = IF ( HASONEVALUE ( DimProduct[Color] ); RANKX ( ALLSELECTED( DimProduct[Color] ); CALCULATE(SUM(FactInternetSales[OrderQuantity] )) )) RETURN vValue
W pierwszej kolejności sprawdzamy czy mamy jedną wartość atrybutu DimPRoduct[Color], a następnie za pomocą funkcji RANKX budujemy ranking w taki sposób, że wybrane przez nas kolory otrzymają odpowiednie miejsce bazując na sumie pola FactInternetSales[OrderQuantity]. Całość na ten moment po przeciągnięciu do tabeli prezentuje się w następujący sposób:
Mając gotowy ranking nie pozostaje nam nic innego jak zamienić liczbę na odpowiedni symbol graficzny. Przyjmując, że chcemy wyświetlić jedną “gwiazdkę” dla pierwszego miejsca, dwie dla drugiego etc to możemy do tego celu wykorzystać funkcję REPT, która wyświetli znak tyle razy ile podaliśmy jako parametr, gdzie podamy stworzony wcześniej ranking:
Number Of Stars = VAR vValue = IF ( HASONEVALUE ( DimProduct[Color] ); RANKX ( ALLSELECTED( DimProduct[Color] ); CALCULATE(SUM(FactInternetSales[OrderQuantity] )) )) RETURN REPT(UNICHAR(9733);vValue)
Cała nasza wizualizacja jest oczywiście dynamiczna i ranking dostosowuje się do selekcji:
Efekt dosyć interesujący i po odpowiednim podrasowaniu od strony graficznej może być ciekawym urozmaiceniem dla raportów. UNICHAR pozwala daje nam dosyć ciekawe możliwości i z całą pewnością nie kończą się one na tylko dwóch przedstawionych przeze mnie. Patrząc na tabelę dostępnych znaków graficznych, które możemy użyć jedyną granicą może być nasza kreatywność i wyobraźnia.
- Avoiding Issues: Monitoring Query Pushdowns in Databricks Federated Queries - October 27, 2024
- Microsoft Fabric: Using Workspace Identity for Authentication - September 25, 2024
- Executing SQL queries from Azure DevOps using Service Connection credentials - August 28, 2024
Last comments