Blog JSystems - uwalniamy wiedzę!

Szukaj

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

Porównanie z poprzednim rokiem przy niepełnym roku - licz do dnia ostatniej sprzedaży

W skrócie

  • Porównanie rok do roku w Power BI przy niepełnym roku pokazuje spadek, którego nie ma: na modelu Nordvelli rok 2026 z danymi do 31 maja wychodzi minus 60,2 procent wobec pełnego 2025.
  • SAMEPERIODLASTYEAR przesuwa o rok wszystkie dni z kontekstu, a kalendarz ma cały rok 2026, więc w mianowniku jest dwanaście miesięcy poprzedniego roku, a w liczniku tylko pięć.
  • Ogranicz daty do dnia ostatniej sprzedaży: zmienna z MAX po tabeli faktów i KEEPFILTERS w CALCULATE dają plus 10,4 procent rok do roku i 98,3 procent realizacji budżetu za 2026.

Rok 2026 wygląda w macierzy lat na zapaść: minus 60,2 procent wobec roku poprzedniego, choć sprzedaż rośnie. Rok jest po prostu niepełny, bo dane kończą się w maju, a porównanie bierze cały rok 2025. Ten sam błąd zaniża realizację budżetu, którą w trakcie roku pokazuje się zarządowi. Na modelu Nordvelli liczymy rok poprzedni i budżet tylko do dnia ostatniej sprzedaży i sprawdzamy, że poprawka działa.

Jak to wygląda w praktyce

W macierzy z polem DimKalendarz[Rok] w wierszach i miarami [Łączna sprzedaż], [Sprzedaż rok temu] i [Zmiana r/r %] lata pełne wyglądają rozsądnie: 2023 plus 13,0 procent, 2024 plus 20,0 procent, 2025 plus 12,1 procent. Rok 2026 pokazuje 50 393 502,91 zł sprzedaży wobec 126 734 270,47 zł rok wcześniej, czyli minus 60,2 procent i minus 76 340 767,56 zł w kolumnie [Zmiana r/r]. Komunikatu o błędzie nie ma, a liczby wprowadzają w błąd.

Ten sam efekt widać w budżecie. Karta [Realizacja budżetu %] dla całego okresu pokazuje 86,3 procent, a po wybraniu roku 2026 we fragmentatorze 43,3 procent. W macierzy miesięcy 2026 każdy miesiąc od czerwca do grudnia ma minus 100 procent, bo sprzedaży w nich jeszcze nie ma, a rok wcześniej była.

Macierz lat Nordvelli: Łączna sprzedaż, Sprzedaż rok temu, Zmiana r/r i Zmiana r/r % od 13,0 do -60,2 procent
Rok 2026 pokazuje minus 60,2 procent, bo dane kończą się na maju: to nie spadek sprzedaży, tylko niepełny rok porównany z pełnym 2025.

Dlaczego tak się dzieje

Dane sprzedaży Nordvelli kończą się 31.05.2026, a tabela DimKalendarz ma wszystkie dni do 31.12.2026, tak jak powinna ciągła tabela dat. Filtr roku 2026 zostawia więc w kontekście filtra, czyli w zestawie warunków nałożonych na model, wszystkie 365 dni roku. SAMEPERIODLASTYEAR przesuwa o rok cały ten zbiór, a nie tylko dni ze sprzedażą, więc [Sprzedaż rok temu] liczy pełny 2025. W liczniku jest pięć miesięcy, w mianowniku dwanaście. Według dokumentacji Microsoft SAMEPERIODLASTYEAR zwraca te same daty co DATEADD z przesunięciem o minus jeden rok, więc zamiana funkcji niczego nie zmienia. Obie miary rok do roku budujemy w lekcji o inteligencji czasowej DAX.

Odruch, żeby koniec okresu wziąć z LASTDATE, też nie pomaga. LASTDATE zwraca ostatnią datę z bieżącego kontekstu kolumny dat, czyli ostatni dzień kalendarza: na modelu Nordvelli 31.12.2026, zarówno bez filtrów, jak i dla roku 2026. Dzień ostatniej sprzedaży daje dopiero MAX(FaktSprzedaz[DataID]) bez filtra kalendarza (20260531) albo LASTNONBLANK z miarą sprzedaży (31.05.2026). Puste komórki w pierwszym roku danych to osobny przypadek, opisany w poście rok do roku pokazuje puste wartości albo zawyżony wzrost.

Co zrobić krok po kroku

  1. Sprawdź, gdzie kończą się dane. W widoku zapytań w języku DAX uruchom zapytanie obok. Na modelu Nordvelli pierwsza kolumna daje 20260531, a druga 31.12.2026, czyli koniec kalendarza, a nie koniec sprzedaży. Gdy obie daty są różne, każda miara porównująca okresy w bieżącym roku potrzebuje poprawki.
    EVALUATE
    ROW (
        "Ostatnia sprzedaż", CALCULATE ( MAX ( FaktSprzedaz[DataID] ), REMOVEFILTERS ( DimKalendarz ) ),
        "LASTDATE kalendarza", CALCULATE ( LASTDATE ( DimKalendarz[Data] ), REMOVEFILTERS ( DimKalendarz ) )
    )
  2. W panelu Dane kliknij prawym przyciskiem tabelę FaktSprzedaz, wybierz Nowa miara i wpisz formułę obok. Zmienna OstatniaSprzedaz to najpóźniejszy DataID w tabeli faktów liczony bez filtra kalendarza, więc ma tę samą wartość przy każdym roku. KEEPFILTERS dokłada warunek do filtra roku zamiast go zastępować, więc dla 2026 zostają dni od 1 stycznia do 31 maja i dopiero ten zbiór SAMEPERIODLASTYEAR przesuwa o rok. Dla 2026 miara zwraca 45 654 769,95 zł, czyli sprzedaż od stycznia do maja 2025. Działanie KEEPFILTERS opisujemy w lekcji o CALCULATE i kontekście filtrów.
    Sprzedaż rok temu do daty =
    VAR OstatniaSprzedaz =
        CALCULATE ( MAX ( FaktSprzedaz[DataID] ), REMOVEFILTERS ( DimKalendarz ) )
    RETURN
        CALCULATE (
            [Sprzedaż rok temu],
            KEEPFILTERS ( DimKalendarz[DataID] <= OstatniaSprzedaz )
        )
  3. Dodaj miarę zmiany procentowej, która dla okresów po ostatniej sprzedaży zwraca wartość pustą zamiast minus 100 procent. Na karcie Narzędzia miar wpisz w polu Format 0.0%. Rok 2026 pokazuje teraz plus 10,4 procent, lata 2023-2025 te same wartości co wcześniej, a miesiące od czerwca do grudnia 2026 zostają puste.
    Zmiana r/r do daty % =
    VAR OstatniaSprzedaz =
        CALCULATE ( MAX ( FaktSprzedaz[DataID] ), REMOVEFILTERS ( DimKalendarz ) )
    RETURN
        IF (
            MIN ( DimKalendarz[DataID] ) <= OstatniaSprzedaz,
            DIVIDE (
                [Łączna sprzedaż] - [Sprzedaż rok temu do daty],
                [Sprzedaż rok temu do daty]
            )
        )
  4. Ten sam wzorzec zastosuj do budżetu i dodaj obok Realizacja budżetu do daty % = DIVIDE([Łączna sprzedaż], [Budżet do ostatniej sprzedaży]). Dla całego okresu realizacja rośnie z 86,3 do 98,1 procent (467 775 009,17 zł wobec 476 782 696,90 zł zamiast 541 917 189,40 zł), a dla roku 2026 z 43,3 do 98,3 procent. Pokaż zarządowi obie liczby, podpisane wprost: pierwsza mówi, ile rocznego planu już zrobiono, druga, czy sprzedaż idzie zgodnie z planem.
    Budżet do ostatniej sprzedaży =
    VAR OstatniaSprzedaz =
        CALCULATE ( MAX ( FaktSprzedaz[DataID] ), REMOVEFILTERS ( DimKalendarz ) )
    RETURN
        CALCULATE (
            [Budżet sprzedaży],
            KEEPFILTERS ( DimKalendarz[DataID] <= OstatniaSprzedaz )
        )
  5. Gdy chcesz poprawić naraz wszystkie miary jednej strony, zamiast nowych miar dodaj do tabeli DimKalendarz kolumnę obliczeniową (Nowa kolumna), przeciągnij ją do sekcji Filtry na tej stronie w panelu Filtry i zaznacz Prawda. Na modelu Nordvelli kolumna przepuszcza 1612 z 1826 dni, a z tym filtrem zwykła [Zmiana r/r %] daje dla 2026 plus 10,4 procent, a [Realizacja budżetu %] 98,3 procent. Filtr działa tylko na stronie, na której go ustawisz.
    Do ostatniej sprzedaży = DimKalendarz[DataID] <= MAX ( FaktSprzedaz[DataID] )
  6. Sprawdź ziarno budżetu. Budżet Nordvelli jest miesięczny i zapisany pod pierwszym dniem miesiąca, więc warunek z kroku 2 wpuszcza cały budżet miesiąca, w którym kończą się dane. Przy danych do 31 maja to poprawne. Gdyby sprzedaż kończyła się 15 maja, budżet do daty nadal wynosiłby 51 290 755,26 zł z całym majem (10 924 127,17 zł), choć sprzedaż z 1-15 maja to 5 288 125,06 zł z 10 704 107,08 zł całego miesiąca. Wtedy porównuj budżet tylko z pełnymi miesiącami (do 30 kwietnia budżet to 40 366 628,09 zł). Sprzedaż rok do roku tego problemu nie ma, bo jest zapisana dziennie.

Jak sprawdzić, że problem zniknął

Porównaj wynik z niezależnym zapytaniem: CALCULATE([Łączna sprzedaż], DimKalendarz[Rok] = 2025, DimKalendarz[Miesiac] <= 5) daje na modelu Nordvelli 45 654 769,95 zł, dokładnie tyle co [Sprzedaż rok temu do daty] dla 2026. Te same 45 654 769,95 zł daje [Sprzedaż YTD] przesunięta przez SAMEPERIODLASTYEAR z tym samym warunkiem KEEPFILTERS do dnia ostatniej sprzedaży, a bez warunku pełne 126 734 270,47 zł, więc narastanie od początku roku ma tę samą pułapkę. W latach pełnych obie wersje miar muszą dawać te same liczby i dają: 2023-2025 bez zmian.

Podpisuj miary wprost (do dnia ostatniej sprzedaży) i pokazuj zmianę rok do roku przy wybranym roku. W wierszu Suma, który obejmuje pięć lat, stara wersja daje 12,1 procent, a nowa 39,1 procent, i żadna z tych liczb nie odpowiada na pytanie zarządu. Gdy budujesz kalendarz sam, pamiętaj o pełnych latach, o czym piszemy w poście o ciągłej tabeli dat dla funkcji inteligencji czasowej.

Źródła i sposób sprawdzenia

  • Microsoft Learn: SAMEPERIODLASTYEAR function (DAX) (źródło)
  • Microsoft Learn: LASTDATE function (DAX) (źródło)
  • Microsoft Learn: LASTNONBLANK function (DAX) (źródło)
  • Microsoft Learn: KEEPFILTERS function (DAX) (źródło)
  • Sprawdzone zapytaniami DAX na modelu Nordvelli: rok do roku i realizacja budżetu po latach i miesiącach, przed i po ograniczeniu dat do 31.05.2026.

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 Power BI pokazuje spadek rok do roku w bieżącym roku?
Gdy dane kończą się w trakcie roku, a tabela kalendarza ma cały rok, SAMEPERIODLASTYEAR przesuwa o rok wszystkie dni kalendarza i porównuje kilka miesięcy bieżącego roku z pełnym rokiem poprzednim. Na modelu Nordvelli rok 2026 z danymi do 31 maja pokazuje przez to minus 60,2 procent, choć sprzedaż od stycznia do maja wzrosła o 10,4 procent.
Jak porównać sprzedaż do tego samego dnia rok wcześniej w Power BI?
Policz w zmiennej dzień ostatniej sprzedaży, na przykład CALCULATE(MAX(FaktSprzedaz[DataID]), REMOVEFILTERS(DimKalendarz)), i dołóż do miary roku poprzedniego w CALCULATE warunek owinięty w KEEPFILTERS, który zostawia tylko dni do tej daty. SAMEPERIODLASTYEAR przesuwa wtedy o rok tylko dni do ostatniej sprzedaży, więc okres od stycznia do maja porównujesz z tym samym okresem rok wcześniej.
Dlaczego LASTDATE nie zwraca daty ostatniej sprzedaży?
LASTDATE zwraca ostatnią datę z bieżącego kontekstu kolumny dat, a tabela kalendarza ma zwykle dni do końca roku. Na modelu Nordvelli LASTDATE(DimKalendarz[Data]) daje 31.12.2026, a ostatnia sprzedaż była 31.05.2026. Datę ostatniej sprzedaży daje MAX po kolumnie daty w tabeli faktów albo LASTNONBLANK z miarą sprzedaży.
Jak policzyć realizację budżetu w trakcie roku w Power BI?
Podziel sprzedaż przez budżet ograniczony do dnia ostatniej sprzedaży, a nie przez budżet całego roku. Na modelu Nordvelli realizacja roku 2026 wynosi 43,3 procent wobec budżetu rocznego i 98,3 procent wobec budżetu do 31 maja. Pierwsza liczba mówi, ile rocznego planu już zrobiono, druga, czy sprzedaż idzie zgodnie z planem.

Komentarze (0)

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

Brak komentarzy...