Blog JSystems - uwalniamy wiedzę!
Blog JSystems - uwalniamy wiedzę!
Power BI - DAX liczy, ale nie to, czego oczekujesz
Porównanie z poprzednim rokiem przy niepełnym roku - licz do dnia ostatniej sprzedaży
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.
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.

Zobacz też: Szkolenie Zaawansowany DAX w Power BI
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.
EVALUATE
ROW (
"Ostatnia sprzedaż", CALCULATE ( MAX ( FaktSprzedaz[DataID] ), REMOVEFILTERS ( DimKalendarz ) ),
"LASTDATE kalendarza", CALCULATE ( LASTDATE ( DimKalendarz[Data] ), REMOVEFILTERS ( DimKalendarz ) )
)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 )
)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]
)
)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 )
)[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] )
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.
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
Komentarze (0)
Brak komentarzy...