Blog JSystems - uwalniamy wiedzę!

Szukaj

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

Średnia krocząca w DAX na początku danych liczy z niepełnych okresów

W skrócie

  • Średnia krocząca w DAX z 12 miesięcy w pierwszych 11 miesiącach danych liczy się z krótszego okna: na modelu Nordvelli w styczniu 2022 pokazuje 7 210 764,27 zł, czyli samą sprzedaż stycznia.
  • DATESINPERIOD zwraca tylko daty, które są w tabeli kalendarza, więc na początku danych okno jest krótsze, a mianownik liczący miesiące kalendarza dzieli przez 1, 2, 3 i kolejne. Na końcu danych ten sam mianownik liczy miesiące bez sprzedaży.
  • Policz w oknie miesiące ze sprzedażą i zwracaj wynik tylko przy pełnych 12. Taka miara ma na Nordvelli 42 wartości, od grudnia 2022 do maja 2026, bez sztucznego początku i bez spadku na końcu.

Średnia krocząca 12M z kursu w styczniu 2022 zwraca 7 210 764,27 zł, czyli dokładnie sprzedaż tego jednego miesiąca. Tak zachowuje się miara w DAX zbudowana na DATESINPERIOD, gdy tabela kalendarza zaczyna się razem z danymi: pierwsze punkty wykresu wyglądają jak średnia z 12 miesięcy, a są średnią z jednego, dwóch albo pięciu. Dalej piszemy miarę, która rozpoznaje niepełne okno i zwraca wynik dopiero przy pełnym. Wszystkie liczby pochodzą z zapytań na modelu Nordvelli.

Jak to wygląda w praktyce

W modelu Nordvelli sprzedaż zaczyna się 1 stycznia 2022 i kończy 31 maja 2026, a tabela DimKalendarz obejmuje pełne lata 2022-2026, czyli 60 miesięcy. Miara Średnia krocząca 12M z kursu w styczniu 2022 zwraca 7 210 764,27 zł, czyli dokładnie sprzedaż stycznia. W lutym pokazuje 6 089 031,97 zł (średnia z dwóch miesięcy), w listopadzie 6 307 816,40 zł (z jedenastu). Pierwsza wartość z pełnych 12 miesięcy pojawia się w grudniu 2022: 6 945 991,19 zł. Linia startuje więc z poziomu jednego miesiąca, a potem podskakuje, gdy do okna wchodzi grudzień ze sprzedażą 13 965 913,91 zł.

Tak samo zachowuje się średnia z trzech miesięcy: styczeń i luty 2022 to średnie z jednego i dwóch miesięcy. Na drugim końcu osi miesiące od czerwca do grudnia 2026 nie mają sprzedaży, a średnia z 12 miesięcy dalej ma tam wartości, które spadają do 4 199 458,58 zł w grudniu. Tyle samo pokazuje karta z tą miarą bez żadnego filtra dat, bo bez filtra okno kończy się 31 grudnia 2026.

Dlaczego tak się dzieje

DATESINPERIOD buduje okno dat od ostatniej daty w kontekście, czyli od LASTDATE(DimKalendarz[Data]), o zadaną liczbę miesięcy wstecz. Według dokumentacji Microsoft dla kolumny dat funkcja zwraca tylko daty zapisane w tej kolumnie: gdy kalendarz zaczyna się 1 stycznia 2022, okno dla stycznia 2022 zaczyna się tego samego dnia, a nie rok wcześniej. Miara z kursu dzieli sumę okna przez DISTINCTCOUNT(DimKalendarz[RokMiesiac]), więc w styczniu 2022 dzieli przez 1, w lutym przez 2, a w listopadzie przez 11. Sprawdziliśmy to osobną miarą z samym licznikiem: zwraca kolejno 1, 2, 3 i dochodzi do 12 w grudniu 2022.

Taki mianownik chroni przed większym błędem. Wersja ze sztywną dwunastką, DIVIDE(SumaOkna, 12), w styczniu 2022 daje 600 897,02 zł, czyli dwunastą część jednego miesiąca, i dochodzi do pełnego poziomu dopiero w grudniu. Licznik miesięcy kalendarza ma za to słabość na końcu danych: w grudniu 2026 nadal pokazuje 12, choć sprzedaż jest tylko w pięciu miesiącach okna, więc suma pięciu miesięcy dzieli się przez 12. Tak samo liczy miesiące bez transakcji, gdy kalendarz zaczyna się wcześniej niż sprzedaż: w zapytaniu, w którym pominęliśmy sprzedaż sprzed lipca 2022, licznik w grudniu 2022 nadal pokazał 12, choć sprzedaż była tylko w sześciu miesiącach okna. Koniec danych w porównaniach rok do roku opisujemy w poście porównanie z poprzednim rokiem przy niepełnym roku.

Pasek formuł Power BI z miarą Średnia krocząca 12M: DATESINPERIOD, SumaOkna i LiczbaMiesiecy w zmiennych VAR
Miara Średnia krocząca 12M z kursu. DATESINPERIOD buduje okno dwunastu miesięcy wstecz od ostatniej daty w kontekście, a suma okna dzieli się przez liczbę miesięcy kalendarza w tym oknie.

Co zrobić krok po kroku

  1. Sprawdź, od kiedy są dane, a od kiedy kalendarz. Na lewym pasku otwórz Widok zapytań w języku DAX i uruchom zapytanie z pierwszą i ostatnią datą obu tabel. Na Nordvelli kalendarz obejmuje 1 stycznia 2022 - 31 grudnia 2026, a sprzedaż wartości DataID od 20220101 do 20260531. Pierwsze pełne okno 12 miesięcy kończy się więc w grudniu 2022.
    EVALUATE
    ROW (
        "Kalendarz od", MIN ( DimKalendarz[Data] ),
        "Kalendarz do", MAX ( DimKalendarz[Data] ),
        "Sprzedaż od", MIN ( FaktSprzedaz[DataID] ),
        "Sprzedaż do", MAX ( FaktSprzedaz[DataID] )
    )
  2. Dodaj tymczasowo miarę z samym licznikiem miesięcy w oknie: prawy przycisk na FaktSprzedaz w panelu Dane, Nowa miara. Połóż ją w tabeli obok DimKalendarz[RokMiesiac]. Gdy w pierwszych wierszach widzisz 1, 2, 3 zamiast 12, średnia w tych miesiącach jest liczona z niepełnego okna.
    Miesiące w oknie =
    CALCULATE (
        DISTINCTCOUNT ( DimKalendarz[RokMiesiac] ),
        DATESINPERIOD ( DimKalendarz[Data], LASTDATE ( DimKalendarz[Data] ), -12, MONTH )
    )
  3. Utwórz miarę z warunkiem pełnego okna, tak samo przez Nowa miara. Zamiast miesięcy kalendarza liczy ona miesiące, w których jest sprzedaż, a wynik zwraca tylko wtedy, gdy jest ich 12. W pozostałych miesiącach zwraca pustą wartość, więc nie udaje średniej rocznej.
    Średnia krocząca 12M (pełne okno) =
    VAR Okno =
        DATESINPERIOD ( DimKalendarz[Data], LASTDATE ( DimKalendarz[Data] ), -12, MONTH )
    VAR SumaOkna = CALCULATE ( [Łączna sprzedaż], Okno )
    VAR MiesiaceZeSprzedaza =
        CALCULATE (
            COUNTROWS ( FILTER ( VALUES ( DimKalendarz[RokMiesiac] ), [Łączna sprzedaż] > 0 ) ),
            Okno
        )
    RETURN
        IF ( MiesiaceZeSprzedaza = 12, DIVIDE ( SumaOkna, 12 ) )
  4. Podmień miarę na wykresie liniowym: w obszarze Oś Y zastąp miarę Średnia krocząca 12M nową miarą. Na Nordvelli nowa miara ma 42 wartości, od grudnia 2022 (6 945 991,19 zł) do maja 2026 (10 956 083,62 zł). Dla stycznia-listopada 2022 i czerwca-grudnia 2026 zwraca pustą wartość.
  5. Dla średniej z trzech miesięcy zmień w nowej mierze 12 na 3 w obu miejscach: -3 w DATESINPERIOD i 3 w warunku. Wersja trzymiesięczna zaczyna się w marcu 2022 od 6 115 471,04 zł i ma 51 wartości do maja 2026.
  6. Kartę z jedną liczbą filtruj na ostatni pełny miesiąc. Bez filtra dat okno kończy się na ostatnim dniu kalendarza, więc nowa miara zwraca pustą wartość, a stara 4 199 458,58 zł. Z filtrem na maj 2026 obie dają 10 956 083,62 zł. Gdy po sprawdzeniu nie potrzebujesz już miary Miesiące w oknie, usuń ją z modelu.

Jak sprawdzić, że problem zniknął

Porównaj starą i nową miarę w tabeli z kolumną RokMiesiac. Od grudnia 2022 do maja 2026 muszą być równe, bo okno ma wtedy 12 miesięcy ze sprzedażą: grudzień 2022 to w obu 6 945 991,19 zł, czyli sprzedaż roku 2022 (83 351 894,30 zł) podzielona przez 12. Różnice mogą być tylko na brzegach danych, gdzie nowa miara jest pusta. Druga kontrola to liczba wartości: przy danych od stycznia 2022 do maja 2026, czyli z 53 miesięcy, średnia 12-miesięczna ma 53 - 11 = 42 wartości, i tyle zwróciło zapytanie.

Przy każdej mierze z oknem czasowym sprawdzaj dwa miejsca: ile miesięcy z danymi jest w oknie na początku osi i co dzieje się za ostatnią datą sprzedaży. Wymagania wobec tabeli dat opisujemy w poście o funkcjach inteligencji czasowej i ciągłej tabeli dat, a różnice między AVERAGE, AVERAGEX i średnią z miesięcy w poście o trzech sposobach liczenia średniej.

Źródła i sposób sprawdzenia

  • Microsoft Learn: DATESINPERIOD function (DAX) (źródło)
  • Microsoft Learn: CALCULATE function (DAX) (źródło)
  • Sprawdzone zapytaniami DAX na modelu Nordvelli: zakres kalendarza i sprzedaży, miara Średnia krocząca 12M i 3M z kursu, licznik miesięcy w oknie, wariant ze sztywną dwunastką i miara z warunkiem pełnego okna.

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 średnia krocząca w Power BI na początku wykresu ma inną wartość?
Okno DATESINPERIOD zawiera tylko daty z tabeli kalendarza, więc w pierwszych miesiącach danych jest krótsze niż 12 miesięcy. Miara dzieląca przez liczbę miesięcy w oknie pokazuje wtedy średnią z 1, 2 albo 11 miesięcy. Na modelu Nordvelli styczeń 2022 to po prostu sprzedaż tego miesiąca, 7 210 764,27 zł.
Jak pokazać średnią kroczącą tylko dla pełnego okna 12 miesięcy?
Policz w oknie miesiące, w których jest sprzedaż, na przykład przez COUNTROWS z FILTER po kolumnie RokMiesiac, i zwracaj wynik tylko wtedy, gdy jest ich 12. W pozostałych miesiącach miara daje pustą wartość. Na Nordvelli taka miara ma 42 wartości, od grudnia 2022 do maja 2026.
Czy średnią kroczącą w DAX dzielić przez 12 czy przez liczbę miesięcy?
Sztywna dwunastka zaniża wynik na początku danych: na Nordvelli w styczniu 2022 daje 600 897,02 zł zamiast 7 210 764,27 zł. Liczba miesięcy kalendarza w oknie usuwa ten błąd, ale na końcu danych liczy także miesiące bez sprzedaży. Bezpieczniej liczyć miesiące ze sprzedażą i wymagać pełnego okna.
Dlaczego średnia krocząca spada po ostatnim miesiącu sprzedaży?
Za ostatnią datą sprzedaży kalendarz ma dalej miesiące, a okno 12 miesięcy obejmuje coraz więcej miesięcy bez transakcji. Gdy mianownik liczy miesiące kalendarza, suma maleje, a dzielnik zostaje równy 12. Na Nordvelli średnia spada z 10 956 083,62 zł w maju 2026 do 4 199 458,58 zł w grudniu 2026.

Komentarze (0)

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

Brak komentarzy...