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. 📊
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.
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
DATEADDczyPREVIOUSMONTH, 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
DATEADDczySAMEPERIODLASTYEARwymagają 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ć
DATEADDiPREVIOUSMONTHmogą wydawać się podobne, działają inaczej.DATEADDpozwala przesuwać datę o dowolną liczbę okresów (dni, miesięcy, lat), natomiastPREVIOUSMONTHzwraca 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.
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.