Blog JSystems - uwalniamy wiedzę!

Szukaj

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

Rok do roku w Power BI pokazuje puste wartości albo zawyżony wzrost

W skrócie

  • Miara rok do roku w Power BI pokazuje puste wartości w pierwszym roku danych i przy dacie z tabeli faktów, a różnica w złotych w pierwszym roku równa się całej sprzedaży, co wygląda jak zawyżony wzrost.
  • SAMEPERIODLASTYEAR przesuwa daty bieżącego kontekstu o rok. Gdy roku wcześniej nie ma, wynik jest pusty, a odejmowanie traktuje pustą wartość jak zero. Data z faktów nie zdejmuje filtra roku z kalendarza.
  • Licz porównanie na kolumnie dat z oznaczonej tabeli kalendarza, zwracaj pustą wartość, gdy brakuje roku poprzedniego, i ukryj porównanie w wierszu Suma przez HASONEVALUE. Niepełny bieżący rok wymaga osobnej miary.

Największy „wzrost” w macierzy lat z miarą SAMEPERIODLASTYEAR ma rok 2022: 83 351 894,30 zł, choć nie ma go z czym porównać. Puste komórki porównania rok do roku w pierwszym roku są zrozumiałe, ale ta kwota to po prostu cała sprzedaż 2022, a wiersz Suma pokazuje do tego wzrost 12,07%, którego nikt nie liczył. Pokazujemy na modelu Nordvelli, skąd biorą się puste komórki i zawyżone liczby i jak napisać miary, które tego nie robią.

Jak to wygląda w praktyce

Macierz lat z czterema miarami z kursu: Łączna sprzedaż, Sprzedaż rok temu, Zmiana r/r i Zmiana r/r %. W wierszu 2022 sprzedaż rok temu i procent są puste, ale Zmiana r/r pokazuje 83 351 894,30 zł, czyli całą sprzedaż 2022 roku. Na wykresie słupkowym zmian byłby to najwyższy słupek, choć porównania nie było. Kolejne lata są poprawne: 2023 to +10 852 445,95 zł (13,02%), 2024 +18 886 660,99 zł (20,05%), 2025 +13 643 269,23 zł (12,06%).

Wiersz Suma pokazuje 50 393 502,91 zł i 12,07%, czyli „wzrost” wszystkich lat razem. Inna wersja miary, zbudowana na dacie z tabeli faktów, w każdym roku jest pusta. Wersja z kolumną DataID kończy się komunikatem „Kolumna określona w wywołaniu funkcji „SAMEPERIODLASTYEAR” nie jest typu DATE. Jest to nieobsługiwane.” (w angielskiej wersji: „A column specified in the call to function 'SAMEPERIODLASTYEAR' is not of type DATE. This is not supported.”).

Macierz lat Nordvelli: Łączna sprzedaż, Sprzedaż rok temu, Zmiana r/r i Zmiana r/r % od 13,0 do -60,2 procent
Rok 2022 nie ma z czym się porównać: Sprzedaż rok temu i Zmiana r/r % są puste, a Zmiana r/r pokazuje 83 351 894 zł. Rok 2026 pokazuje minus 60,2 procent, bo dane kończą się na maju.

Dlaczego tak się dzieje

Według dokumentacji Microsoft SAMEPERIODLASTYEAR zwraca daty bieżącego kontekstu przesunięte o rok wstecz. W wierszu 2022 to daty 2021, których w modelu Nordvelli nie ma, bo dane i kalendarz zaczynają się 1 stycznia 2022. Miara zwraca pustą wartość. Zmiana r/r % = DIVIDE([Zmiana r/r], [Sprzedaż rok temu], BLANK()) przy pustym mianowniku daje pustą wartość, ale Zmiana r/r = [Łączna sprzedaż] - [Sprzedaż rok temu] odejmuje pustą wartość jak zero i zostaje cała sprzedaż roku. Tak samo styczeń 2022 ma zmianę 7 210 764,27 zł, równą całej sprzedaży miesiąca.

Wiersz Suma nie ma filtra roku, więc kontekst obejmuje daty 2022-2026, a przesunięte daty 2021-2025. Sprzedaż rok temu wynosi 417 381 506,26 zł, czyli sprzedaż lat 2022-2025, a procent 12,07% porównuje pięć lat z czterema. Dlaczego wiersz Suma liczy miarę od nowa, opisujemy w poście o sumie, która nie zgadza się z wierszami.

Data z tabeli faktów zawodzi z innego powodu. Funkcja przesuwa daty kolumny FaktSprzedaz, ale filtr roku z DimKalendarz zostaje. W wierszu 2023 przecięcie roku 2023 z datami 2022 jest puste. Dopiero kolumna dat z oznaczonej tabeli dat sprawia, że funkcja podmienia filtr całego kalendarza.

Co zrobić krok po kroku

  1. Sprawdź, na jakiej kolumnie liczy miara. Ma to być DimKalendarz[Data] typu Data z tabeli oznaczonej jako tabela dat, a nie DataID ani data z tabeli faktów. Według dokumentacji Microsoft oznaczenie jest obowiązkowe, gdy relacje kalendarza opierają się na kolumnach innego typu niż data, a w modelu Nordvelli relacje idą po liczbowym DataID w formacie RRRRMMDD, na przykład 20220101. Co dokładnie zmienia to ustawienie, opisujemy w poście o opcji Oznacz jako tabelę dat.
  2. Jeśli miara używa daty z faktów, podmień ją na kolumnę z kalendarza. Na modelu Nordvelli wersja z datą pobraną do FaktSprzedaz przez RELATED dała pustą wartość w latach 2023-2026, a na karcie bez filtra 336 302 005,74 zł, czyli liczbę, która nic nie znaczy. Wersja z DimKalendarz[Data] dla 2023 daje 83 351 894,30 zł, sprzedaż 2022.
  3. Popraw zmianę w złotych tak, żeby zwracała pustą wartość, gdy brakuje roku poprzedniego, i w wierszach z więcej niż jednym rokiem. Prawy przycisk na FaktSprzedaz, Nowa miara. Na modelu Nordvelli rok 2022 i wiersz Suma są puste, a lata 2023-2026 mają te same kwoty co wcześniej.
    Zmiana r/r porównywalna =
    VAR RokTemu = [Sprzedaż rok temu]
    RETURN
        IF (
            HASONEVALUE ( DimKalendarz[Rok] ) && NOT ISBLANK ( RokTemu ),
            [Łączna sprzedaż] - RokTemu
        )
  4. Tak samo zabezpiecz procent. DIVIDE sam zwraca pustą wartość przy pustym mianowniku, więc wystarczy warunek na wiersz Suma. W macierzy miesięcy działa to na każdym poziomie: styczeń 2022 jest pusty, a styczeń 2023 pokazuje +1 203 171,49 zł i 16,69%.
    Zmiana r/r % porównywalna =
    VAR RokTemu = [Sprzedaż rok temu]
    RETURN
        IF (
            HASONEVALUE ( DimKalendarz[Rok] ),
            DIVIDE ( [Łączna sprzedaż] - RokTemu, RokTemu )
        )
  5. Gdy potrzebujesz innego przesunięcia niż rok, użyj DATEADD, na przykład DATEADD(DimKalendarz[Data], -1, YEAR). Na modelu Nordvelli miara Sprzedaż rok temu DateAdd daje w każdym roku i miesiącu tę samą kwotę co SAMEPERIODLASTYEAR. Według dokumentacji Microsoft wynik DATEADD zawiera tylko daty istniejące w kolumnie dat, a gdy daty w bieżącym kontekście nie tworzą ciągłego przedziału, funkcja zwraca błąd. Takie błędy opisujemy w poście o funkcjach analizy czasowej i ciągłej tabeli dat.
  6. Ostatni wiersz macierzy, rok 2026, pokazuje -60,24%, bo dane kończą się 31 maja 2026, a rok poprzedni jest pełny. To nie spadek sprzedaży, tylko porównanie pięciu miesięcy z dwunastoma. Miarę, która porównuje oba lata do dnia ostatniej sprzedaży, opisujemy w poście o porównaniu przy niepełnym roku.

Jak sprawdzić, że problem zniknął

Sprawdź trzy miejsca macierzy. Pierwszy rok danych ma mieć puste porównanie w obu miarach, a nie kwotę równą sprzedaży. Drugi rok ma pokazywać jako sprzedaż rok temu dokładnie sprzedaż pierwszego roku: na modelu Nordvelli 83 351 894,30 zł w wierszu 2023. Wiersz Suma ma być pusty. Ten sam test zrób na poziomie miesięcy, bo tam pierwszy rok danych daje dwanaście pustych porównań, a nie jedno.

Każdą miarę porównawczą buduj na kolumnie dat z kalendarza i w tym samym wzorcu: zmienna z wartością okresu poprzedniego, warunek na brak tej wartości i na wiersz Suma. Na wykresach zmian sprawdzaj, czy pierwszy słupek nie jest po prostu sprzedażą pierwszego okresu.

Źródła i sposób sprawdzenia

  • Microsoft Learn: SAMEPERIODLASTYEAR function (DAX) (źródło)
  • Microsoft Learn: DATEADD function (DAX) (źródło)
  • Microsoft Learn: Set and use date tables in Power BI Desktop (kiedy trzeba oznaczyć tabelę dat) (źródło)
  • Microsoft Learn: HASONEVALUE function (DAX) (źródło)
  • Sprawdzone zapytaniami DAX na modelu Nordvelli: macierz lat i miesięcy z miarami z kursu, wiersz Suma, data z tabeli faktów, DataID, DATEADD i poprawione miary porównawcze.

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 rok do roku w Power BI pokazuje puste wartości?
SAMEPERIODLASTYEAR przesuwa daty bieżącego kontekstu o rok, więc w pierwszym roku danych trafia w daty, których nie ma, i zwraca pustą wartość. Puste wartości we wszystkich latach oznaczają zwykle, że miara używa daty z tabeli faktów zamiast kolumny dat z oznaczonej tabeli kalendarza. Wtedy filtr roku z kalendarza zostaje i przecięcie z przesuniętymi datami jest puste.
Dlaczego zmiana rok do roku w pierwszym roku pokazuje całą sprzedaż?
Miara liczona jako sprzedaż minus sprzedaż rok temu odejmuje pustą wartość jak zero. Na modelu Nordvelli w 2022 daje to 83 351 894,30 zł, czyli całą sprzedaż roku. Zapisz sprzedaż rok temu w zmiennej i zwracaj wynik tylko wtedy, gdy ta zmienna nie jest pusta.
Dlaczego SAMEPERIODLASTYEAR zgłasza, że kolumna nie jest typu DATE?
Funkcja wymaga kolumny typu Data, a dostała na przykład liczbowy klucz daty w formacie RRRRMMDD. Silnik zgłasza wtedy, że kolumna określona w wywołaniu funkcji SAMEPERIODLASTYEAR nie jest typu DATE. Podaj kolumnę dat z tabeli kalendarza oznaczonej jako tabela dat.
Jak ukryć porównanie rok do roku w wierszu Suma?
Dodaj do miary warunek HASONEVALUE na kolumnie roku. W wierszu Suma kontekst obejmuje kilka lat, więc miara zwraca pustą wartość. Na modelu Nordvelli bez tego warunku wiersz Suma pokazuje 12,07%, czyli porównanie pięciu lat z czterema.

Komentarze (0)

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

Brak komentarzy...