Blog JSystems - uwalniamy wiedzę!
Blog JSystems - uwalniamy wiedzę!
Power BI - DAX liczy, ale nie to, czego oczekujesz
Średnia krocząca w DAX na początku danych liczy z niepełnych okresów
Ś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.
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.
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.
Zobacz też: Szkolenie Zaawansowany DAX w Power BI
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.

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] )
)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 )
)Ś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 ) )-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.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.
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...