Jak zbudować miarę pokazującą wartość z poprzedniego miesiąca w DAX?

Dowiedz się, jak zbudować miarę w DAX pokazującą wartość z poprzedniego miesiąca. Porady, funkcje DAX i najlepsze praktyki w Power BI. 📊
13 lipca 2025
blog
Poziom: Średnio zaawansowany

Artykuł przeznaczony dla użytkowników Power BI i analityków danych, którzy znają podstawy DAX i chcą tworzyć oraz weryfikować miary czasowe dla porównań miesiąc do miesiąca.

Z tego artykułu dowiesz się

  • Jak w DAX stworzyć miarę zwracającą wartość z poprzedniego miesiąca w Power BI?
  • Jak działają konteksty filtrowania i dlaczego są kluczowe w miarach opartych na czasie?
  • Czym różnią się funkcje DATEADD i PREVIOUSMONTH oraz jak unikać typowych błędów przy ich użyciu?

Wprowadzenie do mierzenia wartości z poprzedniego miesiąca w DAX

Tworzenie miar w DAX, które odwołują się do wartości z przeszłości, jest jednym z najczęstszych wyzwań podczas pracy z analizą danych czasowych w Power BI. Jednym z najczęstszych przypadków użycia jest potrzeba porównania aktualnych wyników z wartościami z poprzedniego miesiąca — na przykład sprzedaży, kosztów lub liczby zamówień.

W DAX istnieje kilka podejść, które pozwalają uzyskać dane z poprzedniego okresu. Najczęściej wykorzystywane to funkcje takie jak DATEADD oraz PREVIOUSMONTH. Obie służą do nawigacji po czasie, ale różnią się sposobem działania i wpływem na kontekst filtrowania. Właściwy wybór funkcji zależy od celu analizy i struktury modelu danych.

Dobrze zaprojektowana miara umożliwia porównanie wyników miesiąc do miesiąca (MoM), wspiera analizy trendów oraz pozwala na tworzenie bardziej dynamicznych i interaktywnych raportów. Zastosowanie takich miar zwiększa przejrzystość danych oraz ułatwia podejmowanie decyzji biznesowych opartych na faktach.

Przykład końcowego rezultatu takiej miary może wyglądać następująco:

PoprzedniMiesiącWartość = CALCULATE(SUM('FaktSprzedaż'[Wartość]), DATEADD('Kalendarz'[Data], -1, MONTH))

Powyższy kod to uproszczony przykład obliczenia sumy wartości sprzedaży z poprzedniego miesiąca. W dalszych częściach artykułu omówimy, jak dokładnie działają poszczególne funkcje oraz jak dostosować miary do różnych scenariuszy analitycznych.

Zrozumienie kontekstów filtrowania w DAX

W języku DAX kontekst filtrowania odgrywa kluczową rolę w określaniu, jak obliczenia są wykonywane w zależności od tego, jakie dane są widoczne w danym momencie analizy. Zrozumienie kontekstu filtrowania to absolutna podstawa skutecznego tworzenia miar, zwłaszcza takich, które odnoszą się do wartości w czasie, jak np. z poprzedniego miesiąca.

Możemy wyróżnić kilka typów kontekstów, z których dwa mają największe znaczenie w codziennej pracy:

  • Kontekst wiersza — dotyczy pojedynczego wiersza tabeli i jest zwykle używany w kolumnach obliczeniowych. Każdy wiersz jest analizowany osobno, a funkcje operują na wartościach dostępnych w danym wierszu.
  • Kontekst filtrowania — odnosi się do zestawu filtrów działających w danym momencie na model danych, np. przez wybór w wizualizacji, slicer lub inne miary. To właśnie na tym kontekście opierają się miary analizujące dane w czasie, takie jak obliczenia wartości z poprzedniego miesiąca.

Dodatkowo, DAX pozwala również modyfikować kontekst filtrowania za pomocą funkcji takich jak CALCULATE(), co umożliwia tworzenie bardziej zaawansowanych i dynamicznych obliczeń. Przykładowo, funkcja ta pozwala na zmianę bieżącego kontekstu czasu i obliczenie wartości według określonego zakresu dat – co jest przydatne przy analizie trendów miesięcznych.

Żeby skutecznie tworzyć miary pokazujące dane z poprzedniego miesiąca, konieczne jest zrozumienie, jak bieżący kontekst wpływa na wartość obliczeń i jak można ten kontekst programowo zmieniać. Bez tej wiedzy łatwo dojść do błędnych wyników, nawet jeśli funkcje DAX użyte w formule wydają się poprawne.

💡 Pro tip: Świadomie steruj kontekstem filtrowania: używaj CALCULATE, aby dodawać lub zdejmować filtry (ALL, ALLEXCEPT, KEEPFILTERS). Diagnozuj kontekst czasu miarami pomocniczymi HASONEVALUE/ISFILTERED, zanim zastosujesz obliczenia okresowe.

Użycie funkcji DATEADD do uzyskania danych z poprzedniego miesiąca

W języku DAX funkcja DATEADD jest często wykorzystywana do analiz porównawczych w czasie. Pozwala ona na przesunięcie zestawu dat o określoną liczbę jednostek czasu — miesięcy, dni, kwartałów lub lat — względem bieżącego kontekstu. Dzięki temu możemy łatwo uzyskać dane dla okresu poprzedzającego obecny, np. wartości sprzedaży z poprzedniego miesiąca.

Podstawowe zastosowanie funkcji DATEADD wygląda następująco:

Sales Previous Month = 
CALCULATE(
    SUM(Sales[Amount]),
    DATEADD('Date'[Date], -1, MONTH)
)

W tym przykładzie funkcja DATEADD przesuwa kontekst daty o jeden miesiąc wstecz, a funkcja CALCULATE przelicza sumę sprzedaży (Sales[Amount]) dla tego przesuniętego okresu.

Najważniejsze cechy DATEADD w kontekście pracy z poprzednim miesiącem to:

  • Elastyczność: Możliwość przesuwania o dowolną jednostkę czasu – w tym o więcej niż jeden miesiąc.
  • Wymaganie ciągłości dat: Funkcja działa poprawnie tylko, jeśli tabela dat (np. 'Date'[Date]) zawiera pełny i ciągły zakres dat bez braków.
  • Działa w kontekście kolumny daty: Funkcja oczekuje kolumny z datami jako pierwszy argument i zwraca przesunięty zakres dat jako filtr.

W przeciwieństwie do innych funkcji czasowych (np. PREVIOUSMONTH), DATEADD pozwala na większą kontrolę nad kierunkiem i zakresem przesunięcia, co czyni ją bardziej uniwersalnym narzędziem do analiz porównawczych w czasie. Jeśli chcesz pogłębić swoją wiedzę na temat funkcji czasowych i analizy danych w DAX, zapoznaj się z kursem Język DAX i język M - wykorzystanie funkcji języka DAX i analiza danych przy użyciu języka M.

W dalszej części artykułu omówimy, jak DATEADD wypada w porównaniu do innych funkcji czasowych oraz jak unikać typowych błędów przy jej stosowaniu.

Wykorzystanie funkcji PREVIOUSMONTH i różnice względem DATEADD

W DAX istnieje kilka sposobów na pozyskanie wartości z poprzedniego miesiąca, a dwie najczęściej używane funkcje to PREVIOUSMONTH i DATEADD. Choć na pierwszy rzut oka mogą wydawać się podobne, ich działanie różni się w istotnych aspektach, co wpływa na ich zastosowanie w różnych scenariuszach analitycznych.

PREVIOUSMONTH to funkcja zaprojektowana specjalnie do pracy z hierarchiami dat miesięcznych. Zwraca ona tabelę zawierającą wszystkie daty przypadające na poprzedni miesiąc względem obecnego kontekstu czasu. Jest szczególnie wygodna, gdy dane są zorganizowane w klasycznej kolumnie dat i używamy modelu kalendarzowego.

Przykład użycia funkcji PREVIOUSMONTH:

Sales Previous Month = CALCULATE(
    [Total Sales],
    PREVIOUSMONTH('Date'[Date])
)

Z kolei DATEADD jest bardziej elastyczna. Pozwala na przesunięcie daty o dowolną liczbę jednostek czasu – dni, miesięcy, kwartałów czy lat – zarówno w przód, jak i wstecz. Dzięki temu sprawdza się w bardziej złożonych scenariuszach analitycznych, gdzie potrzebna jest większa kontrola nad zakresem czasu.

Przykład użycia funkcji DATEADD dla poprzedniego miesiąca:

Sales Previous Month = CALCULATE(
    [Total Sales],
    DATEADD('Date'[Date], -1, MONTH)
)

Poniższa tabela zestawia główne różnice między tymi funkcjami:

Cecha PREVIOUSMONTH DATEADD
Zakres dat Cały poprzedni miesiąc Elastyczny (konkretna liczba jednostek czasu)
Typ funkcji Specjalistyczna (miesięczna) Ogólnego zastosowania
Obsługa skrajnych przypadków Wymaga pełnego kalendarza Bardziej niezawodna w nieregularnych danych
Możliwość przesunięcia o więcej niż 1 jednostkę Nie Tak

Wybór pomiędzy PREVIOUSMONTH a DATEADD zależy więc od kontekstu analizy oraz stopnia elastyczności, jaki jest potrzebny przy manipulowaniu datami.

Tworzenie przykładowej miary w DAX – krok po kroku

W tej części pokażemy, jak krok po kroku zbudować prostą miarę w języku DAX, która pozwoli wyciągnąć wartość miary z poprzedniego miesiąca. To podejście jest szczególnie przydatne w analizie trendów czasowych, porównaniach okresów czy raportowaniu KPI w Power BI. Jeśli chcesz pogłębić swoją wiedzę i nauczyć się więcej praktycznych technik z zakresu DAX i wizualizacji danych, zapoznaj się z Kursem DAX – praca w języku DAX i użyteczne funkcje, wizualizacja danych w Power BI.

Aby stworzyć taką miarę, potrzebujemy dwóch elementów:

  • Miary bazowej – czyli wartości, którą śledzimy (np. suma sprzedaży).
  • Logiki przesuwającej czas – pozwalającej odnieść się do odpowiedniego okresu w przeszłości (np. poprzedni miesiąc).

Poniżej znajduje się uproszczony przykład, który tworzy miarę sumy sprzedaży z poprzedniego miesiąca:

Sprzedaż Poprzedni Miesiąc = 
CALCULATE(
    [Suma Sprzedaży],
    DATEADD('Kalendarz'[Data], -1, MONTH)
)

W powyższym przykładzie przyjęto, że:

  • [Suma Sprzedaży] to wcześniej zdefiniowana miara bazowa (np. SUM(FaktSprzedaz[Kwota])).
  • 'Kalendarz'[Data] pochodzi z pełnej tabeli dat, która jest odpowiednio połączona z tabelą faktów.

W zależności od charakterystyki danych i oczekiwanego rezultatu, można też wykorzystać inną funkcję czasową, np. PREVIOUSMONTH, która w niektórych przypadkach może być bardziej intuicyjna. Poniżej zestawienie różnic między dwiema najczęściej stosowanymi metodami:

Funkcja Opis Elastyczność
DATEADD Przesuwa kontekst dat o określoną jednostkę czasu (np. -1 miesiąc). Wysoka – można przesuwać o dowolną liczbę dni/miesięcy/lat.
PREVIOUSMONTH Automatycznie zwraca cały poprzedni miesiąc względem bieżącego kontekstu. Średnia – działa tylko na pełnych miesiącach.

Wybór między tymi podejściami zależy od potrzeb analitycznych oraz struktury danych. W dalszych sekcjach omówimy szczegółowo różnice między tymi funkcjami, a także potencjalne pułapki, jakie mogą wystąpić przy ich zastosowaniu.

Typowe błędy i jak ich unikać przy pracy z czasem w Power BI

Praca z danymi czasowymi w Power BI może prowadzić do nieoczekiwanych wyników, jeśli nie uwzględnimy kilku kluczowych aspektów. Poniżej przedstawiamy najczęstsze błędy popełniane przy tworzeniu miar opartych na czasie oraz sposoby ich unikania.

  • Brak pełnego kalendarza dat

    Funkcje czasu w DAX, takie jak DATEADD czy PREVIOUSMONTH, wymagają kompletnego i ciągłego kalendarza dat. Jeśli tabela dat zawiera luki lub nie obejmuje wszystkich analizowanych okresów, funkcje te mogą zwracać BLANK().

  • Nieprawidłowe relacje między tabelami

    Miary czasowe nie będą działały prawidłowo, jeśli brak jest poprawnie zdefiniowanej relacji między tabelą faktów a tabelą dat. Upewnij się, że tabela dat jest połączona jednokierunkową relacją do tabeli z miarami.

  • Stosowanie funkcji czasu poza kontekstem dat

    Funkcje takie jak DATEADD czy SAMEPERIODLASTYEAR wymagają obecności kontekstu daty w wizualizacji lub filtrze. Ich użycie bez aktywnego kontekstu daty spowoduje, że miara nie zwróci oczekiwanej wartości.

  • Mylenie funkcji manipulujących czasem

    Choć DATEADD i PREVIOUSMONTH mogą wydawać się podobne, działają inaczej. DATEADD pozwala przesuwać datę o dowolną liczbę okresów (dni, miesięcy, lat), natomiast PREVIOUSMONTH zwraca wszystkie dni z poprzedniego miesiąca względem aktualnego kontekstu daty.

  • Nieprawidłowe formatowanie daty

    Upewnij się, że kolumny dat w modelu danych mają odpowiedni typ danych (Date) i nie zawierają błędnych lub niekompletnych wartości. Pozwoli to uniknąć błędów przy filtrowaniu i obliczeniach.

Aby zminimalizować ryzyko błędów, warto stosować dobrze przygotowaną tabelę kalendarza oraz świadomie zarządzać kontekstem filtrowania w raportach. Przykładowy błąd wynikający z braku odpowiedniego kontekstu daty może wyglądać tak:

-- Błąd: funkcja DATEADD zwraca BLANK() bez kontekstu daty
Previous Month Sales :=
    CALCULATE(
        [Total Sales],
        DATEADD('Date'[Date], -1, MONTH)
    )

W powyższym przypadku brak kontekstu daty (np. w formie filtru lub wizualizacji) powoduje, że wygenerowana miara nie działa zgodnie z oczekiwaniami.

💡 Pro tip: Oznacz tabelę kalendarza jako Mark as date table, zapewnij ciągły zakres dat i relację 1:* do faktów. Testuj miary na wizualu z datą (np. matryca/linia), aby szybko wykryć brak kontekstu dla DATEADD czy SAMEPERIODLASTYEAR.

Testowanie i weryfikacja poprawności działania miary

Po utworzeniu miary pokazującej wartość z poprzedniego miesiąca, kluczowym krokiem jest sprawdzenie jej poprawności. Nawet dobrze wyglądająca miara może dawać błędne wyniki, jeśli nie zostanie odpowiednio przetestowana w rzeczywistym kontekście raportu. Testowanie to nie tylko kwestia techniczna — to również weryfikacja, czy miara spełnia oczekiwania biznesowe.

Aby skutecznie przetestować działanie miary, warto przejść przez kilka etapów:

  • Porównanie z surowymi danymi: Sprawdź ręcznie, czy wyliczona wartość dla poprzedniego miesiąca zgadza się z rzeczywistymi danymi w tabeli źródłowej. Najlepiej używać do tego kontrolnych przykładów, np. konkretnych dat lub miesięcy, które łatwo zweryfikować.
  • Testowanie w różnych kontekstach filtrowania: Umieść miarę w różnych wizualizacjach, takich jak tabele, wykresy kolumnowe czy karty, i przefiltruj dane według różnych wymiarów (np. region, produkt, kategoria). To pozwoli upewnić się, że logika DAX działa niezależnie od kontekstu raportu.
  • Sprawdzenie granic okresów czasu: Zwróć uwagę na miesiące początkowe, gdzie brak jest danych z poprzedniego miesiąca. W takich przypadkach miara powinna zwracać pustą wartość lub zero – w zależności od oczekiwanego zachowania.
  • Porównanie z innymi miarami czasowymi: Jeśli raport zawiera również miary dla bieżącego miesiąca lub zmiany procentowe, upewnij się, że wartości są ze sobą spójne. Różnice mogą wskazywać na problemy z przesunięciem czasu lub nieprawidłowe użycie kontekstu.

Poprawne testowanie wymaga również interpretacji wyników – w razie niezgodności warto zweryfikować nie tylko kod DAX, ale także strukturę modelu danych, relacje między tabelami oraz typy danych w kolumnach czasu.

Choć samo napisanie miary jest technicznie wykonalne w kilka minut, jej rzetelne przetestowanie to proces, który może ujawnić subtelne błędy lub nieoczywiste zależności. Warto poświęcić na to czas, aby uniknąć błędnych wniosków w analizie biznesowej.

Podsumowanie i najlepsze praktyki

Tworzenie miary prezentującej wartość z poprzedniego miesiąca w DAX to jedno z częstszych wyzwań analitycznych w Power BI. Kluczowym aspektem jest zrozumienie, jak właściwie odnieść się do okresu „poprzedniego miesiąca” w kontekście danych czasowych i jak wykorzystać dostępne funkcje języka DAX, aby uzyskać precyzyjny wynik.

W praktyce najczęściej wykorzystywane są funkcje DATEADD oraz PREVIOUSMONTH. Choć obie pozwalają na analizę danych z wcześniejszych okresów, różnią się mechanizmem działania oraz zakresem zastosowania. DATEADD oferuje większą elastyczność, umożliwiając przesunięcie w czasie o dowolną liczbę miesięcy, natomiast PREVIOUSMONTH skupia się wyłącznie na bezpośrednio poprzednim miesiącu względem bieżącego kontekstu czasu.

Aby uzyskać wiarygodne wyniki, ważne jest także zadbanie o poprawną strukturę tabeli dat i jej relację z faktami. Bez niej nawet najlepiej napisana miara może nie zadziałać zgodnie z oczekiwaniami. Równie istotne jest uwzględnienie kontekstów filtrowania, które mają bezpośredni wpływ na interpretację czasu w modelu danych.

Najlepsze praktyki podczas pracy z miarami dla poprzedniego miesiąca:

  • Zawsze korzystaj z w pełni ciągłej i kompletnej tabeli dat.
  • Upewnij się, że tabela dat jest poprawnie powiązana z danymi faktów.
  • Wybieraj funkcję odpowiednią do analizowanego scenariusza – DATEADD dla bardziej elastycznych przesunięć, PREVIOUSMONTH dla prostych porównań miesiąc do miesiąca.
  • Testuj miarę w różnych poziomach agregacji (rok, kwartał, miesiąc), aby zweryfikować poprawność działania w różnych kontekstach.

Dzięki świadomemu podejściu do konstrukcji miar czasowych w DAX możliwe jest tworzenie analiz, które nie tylko są poprawne matematycznie, ale także spójne z oczekiwaniami biznesowymi.

icon

Formularz kontaktowyContact form

Imię *Name
NazwiskoSurname
Adres e-mail *E-mail address
Telefon *Phone number
UwagiComments