Blog JSystems - uwalniamy wiedzę!

Szukaj

Power BI - DAX liczy, ale nie to, czego oczekujesz

Grupa obliczeniowa psuje format liczb albo miary procentowe

W skrócie

  • Grupa obliczeniowa w Power BI zmienia format liczb miar, które przez nią przechodzą: element Zmiana procentowa z formatem 0,0% pokazuje pełne procenty, a zastosowany do Marży % liczy zmianę względną zamiast różnicy w punktach procentowych.
  • Element bez wyrażenia formatu dziedziczy format miary, a element z wyrażeniem nadaje go każdej mierze, także procentowej i tekstowej. Po dodaniu grupy raporty traktują wszystkie miary jako typ wariant.
  • Zapisuj format procentowy z kropką, format miary zachowuj przez SELECTEDMEASUREFORMATSTRING, miary procentowe rozpoznawaj przez ISSELECTEDMEASURE, a miary tekstowe przepuszczaj bez obliczeń dzięki ISNUMERIC.

Marża % wzrosła z 16,36% w 2024 do 16,42% w 2025, a element Zmiana procentowa z grupy obliczeniowej Czas pokazuje przy niej zero. Kwoty sprzedaży wyglądają dobrze, ale przy innych miarach grupa obliczeniowa psuje format: wskaźnik procentowy wychodzi w złotych, a miara tekstowa w tytule wykresu kończy się błędem. Wskazujemy element, który za to odpowiada, tłumaczymy, jak działa format w grupie obliczeniowej, i ustawiamy go tak, żeby każda miara wyglądała tak, jak powinna. Liczby pochodzą z grupy Czas w modelu Nordvelli.

Jak to wygląda w praktyce

Grupa Czas w modelu Nordvelli ma cztery elementy: Bieżący, YTD, Rok poprzedni i Zmiana procentowa. Tylko ostatni ma własne wyrażenie formatu, "0,0%;-0,0%;0,0%". Dla sprzedaży wszystko się zgadza: 126 734 270,47 zł w 2025 wobec 113 091 001,24 zł rok wcześniej to zmiana 0,1206, którą format pokazuje jako 12%. Kłopot zaczyna się przy innych miarach. Marża % ma w 2025 wartość 16,42%, a w 2024 16,36%. Element Zmiana procentowa liczy dla niej zmianę względną 0,0036, czyli 0,36%, a funkcja FORMAT z ciągiem tego elementu zwraca „00%”. Odbiorca widzi brak zmiany, choć marża wzrosła o 0,06 punktu procentowego.

Drugi objaw pojawia się, gdy ktoś nada elementowi format walutowy, na przykład #,0 "zł", żeby kwoty miały złotówki. Ten format dostają wtedy także miary procentowe: 16,42% marży z takim formatem daje „0 zł”. Trzeci objaw dotyczy miar tekstowych. Zapytanie z miarą Tytuł wykresu po elementach grupy Czas kończy się błędem „Nie można przekonwertować wartości „Sprzedaż przy rabacie 0%” typu Text na typ Numeric/Date.” (w angielskiej wersji: „Cannot convert value 'Sprzedaż przy rabacie 0%' of type Text to type Numeric/Date.”). Według dokumentacji Microsoft ten błąd pokazują wizualizacje, których dotyczy.

Dlaczego tak się dzieje

Element grupy obliczeniowej to reguła, w której SELECTEDMEASURE oznacza miarę położoną przez użytkownika w wizualizacji. Według dokumentacji Microsoft element domyślnie używa formatu tej miary, dlatego Bieżący, YTD i Rok poprzedni pokazują sprzedaż w złotych, a marżę w procentach. Gdy element ma wyrażenie formatu (w Tabular Editor właściwość Format String Expression), ten format dostaje każda miara przechodząca przez element, bez względu na jej własny format.

W ciągu formatu przecinek nie oznacza miejsca dziesiętnego, tylko separator tysięcy. Zapis 0,0% pokazuje więc procenty bez części dziesiętnej: FORMAT z tym ciągiem zamienia zmianę marży o 0,36% na „00%”, a zmianę średniej oceny klientów o 0,79% na „01%”. Sama formuła elementu, DIVIDE(SELECTEDMEASURE() - Poprzedni, Poprzedni), dla miary procentowej liczy zmianę względną, a nie różnicę w punktach procentowych. Błąd miar tekstowych dokumentacja Microsoft tłumaczy dwiema zasadami: po dodaniu grupy obliczeniowej raporty używają dla wszystkich miar typu wariant, a element, który wykonuje działanie matematyczne na mierze tekstowej, daje błąd konwersji. Elementy, które tylko przepuszczają miarę albo zmieniają filtr, działają: Bieżący, YTD i Rok poprzedni zwróciły dla tytułu tekst „Sprzedaż przy rabacie 0%”.

Tabular Editor: właściwość Format String Expression elementu Zmiana procentowa z trzyczęściowym formatem procentowym
Wyrażenie formatu elementu Zmiana procentowa w grupie Czas. Trzy części zapisu oddzielone średnikami opisują kolejno wartość dodatnią, ujemną i zero.

Co zrobić krok po kroku

  1. Sprawdź, który element ma własny format. W Tabular Editor zaznacz po kolei elementy w folderze Calculation Items i przejrzyj właściwość Format String Expression. W Power BI Desktop otwórz Widok modelu, zaznacz element obliczeniowy i w panelu Właściwości sprawdź przełącznik Ciąg formatu dynamicznego. Szybciej zrobisz to zapytaniem: otwórz Widok zapytań w języku DAX i uruchom kod poniżej. Na Nordvelli tylko Zmiana procentowa ma identyfikator formatu, a drugie zapytanie zwraca jego treść.
    EVALUATE
    SELECTCOLUMNS (
        INFO.CALCULATIONITEMS (),
        "Element", [Name],
        "Kolejność", [Ordinal],
        "Format", [FormatStringDefinitionID]
    )
    
    EVALUATE INFO.FORMATSTRINGDEFINITIONS ()
  2. Z elementów, które mają pokazywać wynik w formacie miary, usuń wyrażenie formatu albo wpisz w nim samo SELECTEDMEASUREFORMATSTRING. Według dokumentacji Microsoft ta funkcja zwraca format miary, która jest w kontekście, więc kwoty zostaną w złotych, a Marża % z formatem 0.00%;-0.00%;0.00% pokaże 16,42% za 2025.
    SELECTEDMEASUREFORMATSTRING ()
  3. W elemencie procentowym zapisz format z kropką: "0.0%;-0.0%;0.0%". Wynik i tak wyświetli się z polskim przecinkiem: FORMAT z tym ciągiem daje dla zmiany sprzedaży 2025 wynik „12,1%” zamiast „12%”. Tak samo zapisany jest format miary Zmiana r/r % z lekcji o funkcjach czasowych YTD i rok do roku, który ma postać 0.0%.
  4. Rozdziel miary procentowe i pozostałe w wyrażeniu formatu elementu Zmiana procentowa. ISSELECTEDMEASURE sprawdza, czy w kontekście jest jedna z wymienionych miar, więc marże dostaną format punktów procentowych, a reszta procent z jednym miejscem po przecinku. Dla różnicy marży 2025 liczonej w następnym kroku (0,0597 punktu procentowego) FORMAT z tym ciągiem zwraca tekst „0,06 p.p.”.
    IF (
        ISSELECTEDMEASURE ( [Marża %], [Marża % (VAR)], [Marża proc po rabacie] ),
        "0.00 ""p.p."";-0.00 ""p.p."";0.00 ""p.p.""",
        "0.0%;-0.0%;0.0%"
    )
  5. W wyrażeniu tego samego elementu policz dla miar procentowych różnicę w punktach procentowych, a miary tekstowe przepuść bez obliczeń przez ISNUMERIC, jak podaje dokumentacja Microsoft. Nasze zapytania DAX nie zmieniają modelu, więc logikę elementu sprawdziliśmy zwykłymi miarami z Marża % i Tytuł wykresu w miejscu SELECTEDMEASURE: lata 2023 i 2024 dają po -0,10 p.p., rok 2025 daje 0,06 p.p., rok 2022 bez poprzednika zostaje pusty, a tytuł przechodzi bez błędu.
    VAR Biezacy = SELECTEDMEASURE ()
    VAR Poprzedni =
        CALCULATE ( SELECTEDMEASURE (), SAMEPERIODLASTYEAR ( DimKalendarz[Data] ) )
    RETURN
        SWITCH (
            TRUE (),
            NOT ISNUMERIC ( Biezacy ), Biezacy,
            ISSELECTEDMEASURE ( [Marża %], [Marża % (VAR)], [Marża proc po rabacie] ),
                IF ( NOT ISBLANK ( Poprzedni ), ( Biezacy - Poprzedni ) * 100 ),
            DIVIDE ( Biezacy - Poprzedni, Poprzedni )
        )
  6. Zapisz zmiany w modelu skrótem Ctrl+S w Tabular Editor i przełącz się do Power BI Desktop. Nad raportem pojawi się pasek „Co najmniej jedna grupa obliczenia wymaga ręcznego odświeżenia”, kliknij w nim Odśwież teraz. Każdą nową miarę procentową dopisz do listy w ISSELECTEDMEASURE w obu wyrażeniach elementu.

Jak sprawdzić, że problem zniknął

Połóż w macierzy DimKalendarz[Rok] w wierszach, kolumnę Name grupy Czas w kolumnach i po kolei Łączna sprzedaż, Marża % i Tytuł wykresu w wartościach. Po poprawkach zmiana sprzedaży 2025 ma jedno miejsce po przecinku (12,1%), zmiana marży pokazuje 0,06 p.p. zamiast zera, a kolumny Bieżący, YTD i Rok poprzedni zachowują format miary. Rok 2022 w kolumnie zmiany jest pusty, bo w modelu nie ma 2021, a rok 2026 ma sprzedaż tylko do maja, więc porównuj go ostrożnie, o czym piszemy w poście o pustych wartościach i zawyżonym wzroście rok do roku.

Do grupy wpuszczaj miary bazowe, a przy każdym elemencie z wyrażeniem formatu sprawdzaj w macierzy co najmniej jedną kwotę, jeden wskaźnik procentowy i jedną miarę tekstową. Gdy format zależny od warunku potrzebny jest tylko jednej mierze, a nie całej grupie, według dokumentacji Microsoft wystarczy ciąg formatu dynamicznego tej miary, bez grupy obliczeniowej.

Źródła i sposób sprawdzenia

  • Microsoft Learn: Create calculation groups (sekcje Dynamic format string i Considerations) (źródło)
  • Microsoft Learn: Calculation groups (Dynamic format strings) (źródło)
  • Microsoft Learn: SELECTEDMEASUREFORMATSTRING function (DAX) (źródło)
  • Microsoft Learn: ISSELECTEDMEASURE function (DAX) (źródło)
  • Sprawdzone zapytaniami DAX na modelu Nordvelli: elementy i formaty grupy Czas, wartości Łącznej sprzedaży i Marży % po elementach, FORMAT z ciągami 0,0%, 0.0% i p.p., błąd miary tekstowej i logika poprawionego elementu.

Zachowanie programu sprawdziliśmy w Power BI Desktop 2.157 (wydanie z sierpnia 2026 r.) z polskim interfejsem, a przykłady na modelu sieci Nordvella z bezpłatnego kursu Power BI. Microsoft wydaje nową wersję Power BI Desktop co miesiąc, więc nazwy przycisków i limity usługi mogą się zmieniać. Aktualne wartości podaje dokumentacja Microsoft Learn.

Wróć do listy: 131 najczęstszych pytań i problemów związanych z Power BI

Najczęściej zadawane pytania

Dlaczego grupa obliczeniowa zmienia format miary?
Element grupy obliczeniowej bez wyrażenia formatu dziedziczy format miary, ale element z wyrażeniem formatu nadaje ten format każdej mierze, która przez niego przechodzi. Gdy element ma format walutowy, miara procentowa przepuszczona przez ten element wyjdzie w złotych. Na modelu Nordvelli 16,42% marży z formatem walutowym daje 0 zł.
Jak zachować format miary w grupie obliczeniowej?
Usuń wyrażenie formatu z elementu albo wpisz w nim SELECTEDMEASUREFORMATSTRING, które zwraca format miary w kontekście. Gdy tylko część miar ma dostać inny format, rozpoznaj je w wyrażeniu formatu funkcją ISSELECTEDMEASURE z listą tych miar.
Dlaczego zmiana procentowa w grupie obliczeniowej pokazuje 0%?
Format zapisany jako 0,0% pokazuje procenty bez części dziesiętnej, bo przecinek w ciągu formatu oznacza separator tysięcy. Zmiana marży o 0,36% wygląda wtedy jak zero. Zapis 0.0% z kropką daje jedno miejsce po przecinku, a dla miar procentowych czytelniejsza jest różnica w punktach procentowych.
Co oznacza błąd nie można przekonwertować wartości typu Text na typ Numeric przy grupie obliczeniowej?
Element grupy wykonuje działanie matematyczne na mierze tekstowej, na przykład na tytule wykresu. Według dokumentacji Microsoft wystarczy w wyrażeniu elementu sprawdzić ISNUMERIC na SELECTEDMEASURE i miarę tekstową zwrócić bez obliczeń. Elementy, które tylko zmieniają filtr, jak YTD, zwracają tekst bez błędu.

Komentarze (0)

Musisz być zalogowany by móc dodać komentarz. Zaloguj się przez Google

Brak komentarzy...