Łączenie tekstu i gubienie formatu DAX w Power BI

DAX
Power BI
Analityka danych

Spis treści:

Przy tworzeniu obliczeń i raportów w Power BI, często potrzebujemy połączyć ze sobą dane tekstowe z innym typem danych: liczbą, datą etc. Choć złączenie w DAX jest proste do zrobienia, często pojawia się problem – nasze dane, np. liczbowe, tracą swoje formatowanie. Wartości pieniężne nie wyglądają jak kwoty, liczby zmiennoprzecinkowe przestają być zaokrąglane, a daty przestają wyglądać tak, jak wcześniej ustawiliśmy. Dzieje się tak dlatego, że DAX, podczas łączenia tekstu z innym typem danych (liczbą czy datą), automatycznie konwertuje ten typ na tekstowy. Tu z pomocą przychodzi funkcja FORMAT(), która pozwoli nam uniknąć tego problemu i wybrać format zgodnie z naszymi oczekiwaniami. W tym artykule pokażemy jak skutecznie radzić sobie z gubieniem formatu podczas łączenia danych oraz przedstawimy bardziej zaawansowany sposób łączenia danych – z wykorzystaniem funkcji CONCATENATEX().

Przykład 1 – proste łączenie tekstu z liczbą

Mamy przykładowe dane zaimportowane do modelu danych w Power BI:

Chcielibyśmy wyświetlić komunikat, informujący nas, ile wynosi suma sprzedaży wszystkich produktów.

Możemy sformatować pole liczbowe Cena sprzedaży, bez miejsc po przecinku, z zachowaniem czytelnego odstępu co 3 cyfry:

Wizualizacja (np. karta) prezentująca sumę cen sprzedaży, będzie wyglądała tak:

W wizualizacji chcielibyśmy przedstawić efekt działania miary, która przedstawi sumę sprzedaży oraz liczbę transakcji, połączone z tekstem. Miara odpowiadająca za wyliczenie:

💡 Ciekawostka:
UNICHAR(10) to nic innego jak znak łamania wiersza.
Przydaje się w wizualizacjach, aby teksty przedstawić w czytelny sposób, w osobnych wierszach.

DAX-Analiza danych

1 500  netto

Dowiedz się jak analizować dane z wykorzystaniem języka DAX (Data Analysis Expressions) w Power BI...
Zobacz szkolenie

Tworzymy wizualizację, wybierając kartę i zaznaczając naszą miarę Komunikat:

Widok karty:

Gdybyśmy użyli tabeli:

To efekt obliczeń wyglądałby tak:

Jak widać, DAX przy łączeniu nie przechował formatu naszej sumy – została ona przekonwertowana na tekst i nie wygląda tak, jak powinna.

Aby rozwiązać problem „zgubienia formatu” wykorzystamy funkcję FORMAT().

Funkcja FORMAT() przyjmuje dwa argumenty:

1

FORMAT(wartość_do_sformatowania, „format”)

Np.

da w rezultacie wynik „12,52 PLN”.

Miara Komunikat wymaga korekty:

2

Komunikat = „Suma sprzedaży wynosi: ”
& FORMAT( SUM(Dane1[Cena sprzedaży]]), „# ##0 zł”) & UNICHAR(10)
& „Liczba transakcji: ” & COUNT(Dane1[Cena sprzedaży])

W powyższej mierze użyliśmy funkcji FORMAT() z formatem # ##0 zł, który wyświetla naszą sumę z separatorem tysięcy, bez miejsc po przecinku i dołączoną jednostką „zł” – zgodnie z typowym zapisem finansowym.

💡 Ciekawostka: # odpowiada za wyświetlenie liczby od 1 do 9, a 0 za liczby od 0 do 9. Taki format łatwo odczytać w Excelu, jeśli sformatujemy komórkę i odnajdziemy format niestandardowy:

Szkolenie Power BI

970  netto

Naucz się tworzyć nowoczesne i dynamiczne raporty w dedykowanym narzędziu ze stajni Microsoft. Dzi...
Zobacz szkolenie

Funkcja FORMAT() pozwala nam elastycznie formatować liczby – można jej użyć, aby dostosować liczbę miejsc po przecinku, zmienić wygląd separatorów oraz zmienić typ danych naszej liczby, np. na walutowy, procentowy czy niestandardowy. Dzięki tej funkcji możemy bezproblemowo dopasować wygląd naszych danych do kontekstu wizualizacji.

Po zmianie, nasza miara Komunikat  przedstawiona połączone teksty z obliczeniami w poprawny sposób:

Przykład 2 – tworzenie opisu klienta

Mamy przykładowe dane zaimportowane do modelu danych w Power BI:

Chcemy stworzyć miarę, która po kliknięciu na ID danego klienta w wizualizacji w formie tabeli, wyświetli komunikat, który połączy jego ID, miesiąc oraz rok pierwszej transakcji oraz łączną wartość wszystkich transakcji, zachowując odpowiednie formaty danych.

W tym przykładzie także wykorzystamy funkcję FORMAT().

💡 Ciekawostka: funkcja FORMAT() oprócz dwóch wymaganych argumentów, daje możliwość użycia trzeciego, opcjonalnego argumentu, nazwy geolokalizacji. Stworzenie kolumn:

FORMAT w języku polskim

Da w wyniku polskie nazwy miesięcy, np. styczeń, luty, etc.

FORMAT w języku angielskim

Da w wyniku angielskie nazwy miesięcy, np. January, February, etc.

Tworzymy wizualizację danych w postaci tabeli:

Tworzymy miarę, która obliczy datę pierwszej transakcji, liczbę transakcji oraz łączną wartość wszystkich transakcji dla wybranego klienta:

Opis klienta bez formatu = 
--Pobieramy ID "klikniętego/wybranego" klienta
VAR __KlientID = SELECTEDVALUE('Transakcje'[ID Klienta])
--Obliczamy datę pierwszej transakcji dla wybranego klienta
VAR __DataPierwsza = 
    CALCULATE(
        MIN('Transakcje'[Data transakcji]),
        ALL('Transakcje'),
        'Transakcje'[ID Klienta] = __KlientID
    )
--Obliczamy liczbę wszystkich transakcji wykonanych przez wybranego klienta
VAR __LiczbaTransakcji = 
    CALCULATE(
        COUNTROWS('Transakcje'),
        ALL('Transakcje'),
        'Transakcje'[ID Klienta] = __KlientID
    )
--Obliczamy sumę cen wszystkich transakcji dokonanych przez wybranego klienta
VAR __SumaTransakcji = 
    CALCULATE(
        SUM('Transakcje'[Cena transakcji]),
        ALL('Transakcje'),
        'Transakcje'[ID Klienta] = __KlientID
    )
--Wynik zależy od wyboru:
--jeżeli nie jest wybrany klient, pojawi się komunikat "Wybierz klienta z tabeli"
--jeżeli wybierzemy klienta, wyświetli się rozbudowany opis
VAR __wynik = IF(
                ISBLANK(__KlientID),
--brak wyboru
                "Wybierz klienta z tabeli",
--rozbudowany opis
                "ID Klienta: " & __KlientID & 
                " | Klient od: " & __DataPierwsza & 
                " | Ilość transakcji: " & __LiczbaTransakcji & 
                " | Łączna wartość: " & __SumaTransakcji
              )
--zwracamy obliczony wynik
RETURN __wynik

Tworzymy wizualizację, która wyświetli nam opis klienta:

Przykładowy wynik po kliknięciu ID Klienta 18:

Jak widać, data oraz sumaryczna wartość wymagają korekty formatu. Aby to zrobić, użyjemy funkcji FORMAT(), zmieniając __wynik w mierze:

VAR __wynik = IF(
                ISBLANK(__KlientID),
--brak wyboru
                "Wybierz klienta z tabeli",
--rozbudowany opis
                "ID Klienta: " & __KlientID & 
                " | Klient od: " & FORMAT(__DataPierwsza, "mmmm yyyy") &
                " | Ilość transakcji: " & __LiczbaTransakcji & 
                " | Łączna wartość: " & FORMAT(__SumaTransakcji, "#,##0 zł")
              )
--zwracamy obliczony wynik
RETURN __wynik

Nasza miara w DAX po korekcie:

Gotowe!

💡 Ciekawostka: przygotowana miara, która wykorzystuje odpowiednio sformatowane dane, poprzez użycie funkcji FORMAT(), może być używana także w innych wizualizacjach – np. jako tytuł wykresu, opisy osi, nagłówki kolumn w tabelach, etc.

Przykład 3 – dynamiczne łączenie tekstów: CONCATENATEX()

W przeciwieństwie do sytuacji, gdy chcemy połączyć ze sobą pojedyncze wartości (jak w przykładach powyżej), zdarza się, że musimy połączyć ze sobą dane z wielu wierszy źródłowej tabeli na raz. Tu z pomocą przychodzi funkcja CONCATENATEX() – pozwala ona nam zebrać dane z wielu pozycji, wykonać potrzebne obliczenia i połączyć je w jeden ciąg tekstowy. Idealnie sprawdza się w połączeniu z funkcją FORMAT(), gdy chcemy zachować czytelne formatowanie danych, które wyświetlamy.

Mamy przykładowe dane zaimportowane do modelu Power BI:

Naszym zadaniem jest obliczenie, jaki procentowy udział w sprzedaży miał każdy z produktów w sprzedaży całkowitej. Wynik ma być przedstawiony czytelnie, w jednej kolumnie tekstowej, dla każdego miesiąca. Nazwy produktów wraz z obliczonymi wartościami połączymy dynamicznie za pomocą funkcji CONCATENATEX().

Tworzymy miarę Raport, która sumuje, w jakiej kwocie sprzedano każdy produkt i oblicza udział w całkowitej sumie sprzedaży – dzieli wartość sprzedaży cząstkowej dla każdego produktu przez sumę całkowitą. Następnie łączy wyniki w jeden ciąg tekstowy:

Raport = 
-- Obliczamy sumę wartości wszystkich sprzedaży
VAR __razem = SUM(DaneSprzedaz[Cena sprzedaży])

-- Obliczamy udział produktów w sprzedaży i łączymy je w ciąg tekstowy za pomocą funkcji CONCATENATEX()
VAR __wynik =
    CONCATENATEX(
        VALUES(DaneSprzedaz[Produkt]),
        DaneSprzedaz[Produkt] & " (" &
        CALCULATE(SUM(DaneSprzedaz[Cena sprzedaży])) / __razem
        & ")",
        " | "
    ) 

RETURN __wynik

Tworzymy wizualizację danych w formie tabeli, w której wyświetlimy miesiące, łączną wartość sprzedaży oraz udział w niej każdego z produktów:

Jak widać, nasze wyliczone dane liczbowe nie są wyświetlone w czytelny sposób – brakuje im właściwego procentowego formatu. Aby uzyskać sformatowane wyniki, możemy użyć funkcji FORMAT(), która liczbę dziesiętną zmieni nam na procenty, np.

0,15  –  FORMAT(0.15, „0.00%”)    da w wyniku 15,00%

Liczba dziesiętna w regionizacji polskiej ma separator dziesiętny w postaci przecinka. Aby jednak poprawnie użyć funkcji FORMAT(), trzeba użyć kropki jako separatora miejsc dziesiętnych.

FORMAT(
                   CALCULATE(SUM(DaneSprzedaz[Cena sprzedaży])) / __razem,
                    "0.00%"
)

Nasza miara w DAX po korekcie:

Raport po zmianie jest gotowy:

Podsumowanie

Łączenie tekstu z innym typem danych to bardzo przydatne narzędzie, które pozwala tworzyć nam czytelne i dynamiczne komunikaty. Dzięki funkcji FORMAT() możemy zachować kontrolę nad wyglądem dat czy liczb, co pozwoli nam uniknąć problemu „gubienia” formatu. W połączeniu z CONCATENATEX() daje nam możliwość tworzenia bardziej złożonych komunikatów i obliczeń, opartych na danych z wielu wierszy.

Podobne artykuły

Wszystkie artykuły