Język DAX, czyli Data Analysis Expressions, możemy określić jako Wyrażenia analizy danych. Jest to język programowania zbudowany z wyrażeń, które są wywołaniami danej funkcji. Wykorzystywany jest przez narzędzia: Power BI, SQL Server Analysis Services (SSAS) i Power Pivot for Excel, a powstał w 2010 roku. Działa na wewnętrznym silniku Tabular, czyli tabelarycznej bazie danych.
Język DAX został stworzony do obliczania formuł biznesowych w modelu danych, jest używany głównie do wyliczania wartości na podstawie zawartości kolumn w tabelach. Z jego pomocą można również wykonać agregacje, czy też wyszukiwanie liczb, jednak do wszystkich tych operacji niezbędne są tabele oraz kolumny.
Na podstawowym poziomie język DAX jest stosunkowo łatwy do opanowania, jednak zaawansowane działania, takie jak konteksty wykonania, iteracje czy też propagowanie kontekstów są zdecydowanie bardziej skomplikowane.
Funkcjami nazywane są formuły w wyrażeniach, a większość z nich ma wymagane i opcjonalne argumenty (inaczej parametry) jako dane wejściowe. Funkcja DAX zawsze odwołuje się do kolumny lub tabeli. Jeżeli chcemy użyć konkretnej wartości, konieczne jest dodanie odpowiednich filtrów. Jeśli na co dzień korzystasz z Excela, być może część z funkcji dostępnych w Power BI wyda Ci się znajoma.
To funkcje agregujące wartości z kolumny i zwracające pojedynczą wartość. Są używane bardzo często, ponieważ prawie każdy model potrzebuje zagregowanych danych do prawidłowego działania. Różnią się między sobą tylko sposobem agregacji danych, a prawie wsyzstki funkcje działają na datach i wartościach numerycznych. Nigdy nie uwzględniają za to pustych wierszy (jedna z różnic względem Excela). Do typowych funkcji agregujących należą: SUM, AVERAGE, MIN, MAX, czy też COUNTROWS, DISTINCTCOUNT.
Jedną z podgrup tego rodzaju funkcji są iteratory. Wyróżniają się one tym, że mogą agregować wyrażenia, a nie pojedynczą kolumnę. Są szczególnie przydatne do wszelkich obliczeń z wykorzystaniem kolumn z wielu powiązanych ze sobą tabel lub kiedy potrzebujemy zmniejszyć liczbę kolumn obliczanych.
Iteratory przyjmują zawsze co najmniej 2 parametry: Pierwszy to tabela, która ma być skanowana, a drugim jest zwykle wyrażenie obliczane dla każdego wiersza tabeli. Po zeskanowaniu tabeli i obliczeniu wyrażenia wiersz po wierszu iteratory agregują częściowe wyniki, zgodnie ze swoja semantyką (działaniem). Większość iteratorów używa takich samych nazw, jak ich odpowiednik nieiteracyjny, uzupełnionych przyrostkiem ‘X’, np. SUMX, MINX, AVERAGEX.
To funkcje stosowane w celu budowy warunków logicznych, np. wykonanie obliczeń w zależności od spełnienia danego warunku lub w drugą stronę – w celu wychwycenia błędu. Wszystkie funkcje z tej grupy działają w dość oczywisty, jak sugeruje nazwa, sposób; np.: AND (oraz), FALSE (fałsz), IF (jeżeli), IFERROR (jeżeli błąd), SWITCH (przełącz), OR (lub). Wspomniana funkcja SWITCH wykorzystywana jest w sytuacji, gdy dana kolumna zawiera niewielką liczbę różnych wartości, a naszym zamiarem jest uzyskanie różnych wyników w zależności od wartości przyjętej z danej kolumny.
Służą do analizy typu wyrażenia, a zatem wskazują, jaki rodzaj wartości jest zwracany przez dane wyrażenie. Wszystkie funkcje tego typu zwracają wartości logiczne i mogą być używane w każdym wyrażeniu warunkowym (np. IF). Do tej grupy należą, na przykład: ISBLANK (czy puste), ISERROR(czy błąd), ISNUMBER (czy liczba).
Działają w analogiczny sposób do funkcji używanych w Excelu. Do najczęściej używanych należą: ABS (wartość bezwzględna), LOG (logarytm), MOD (reszta z dzielenia), SQRT (pierwiastek z liczby), RAND (liczba losowa).
To bogaty zbiór, który również przypominający funkcje znane z Excela. Działanie funkcji trygonometrycznych i hiperbolicznych jest intuicyjne, ponieważ sugerowane przez nazwę, na przykład: COS (cosinus), COTH (cotangens hiperboliczny), ASIN (arcus sinus).
Większość funkcji tekstowych DAX jest analogiczna do ich odpowiedników z Excela. Służą one do manipulacji danymi tekstowymi i wyciągania określonych danych z wielołańcuchowych wartości. Przykładowe funkcje tekstowe: CONCATENATE (połącz dwa ciągi tekstowe w jeden), LEN (zwraca liczbę znaków w ciągu tekstowym), TRIM (usuwa wszystkie spacje poza pojedynczymi między wyrazami).
Jak wskazuje nazwa, są to funkcje, które dokonują konwersji z jednego typu na inny. Należą do nich np.: CURRENCY (przekształca na typ walutowy), INT (zwraca wielkość całkowitoliczbową), VALUE (konwersja tekstu na liczbę).
Wykorzystywane są w niemal każdej analizie danych, ponieważ bardzo często pojawia się konieczność przetwarzania informacji o datach i czasie. Niektóre z nich mają swoje odpowiedniki w Excelu. Jako przykłady można podać: DATE (zwraca określoną datę w formacie daty/godziny), EDATE (zwraca datę, które wypada o określoną liczbę miesięcy przed lub po dacie rozpoczęcia), TODAY (zwraca bieżącą datę).
Język DAX udostępnia dwie funkcje, które umożliwiają nawigowanie po relacjach pomiędzy tabelami w modelu danych: RELATED i RELATEDTABLE. W grupie tej wyróżnione są cztery funkcje: RELATED (zwraca powiązaną wartość z innej tabeli), RELATEDTABLE (oblicza wyrażenie tabeli w nowym kontekście), CROSSFILTER (określa kierunek filtrowania krzyżowego), USERELATIONSHIP (określa relację, która ma być używana w konkretnym obliczeniu).
To jedne z najbardziej skomplikowanych funkcji języka DAX, które znacznie różnią się od tych znanych z programu Excel. Ich działanie opiera się na tabelach i relacjach, tak jak w przypadku bazy danych. Umożliwiają zmienianie kontekstu obliczania, co jest przydatne przy tworzeniu dynamicznych obliczeń. Do najczęściej używanych funkcji filtrowania należą: ALL (zwraca wszystkie wiersze lub wartości, ignorując wszelkie filtry), ALLEXCEPT (usuwa wszystkie filtry kontekstu z tabeli z wyjątkiem określonych kolumn), CALCULATE (oblicza wyrażenie w zmodyfikowanym kontekście filtra).
Są używane do wszelkich obliczeń finansowych, przypominają funkcje znane z Excela. Jako przykłady można wymienić: PV (zwraca wartość bieżącą na podstawie stałej stopy procentowej), FV (zwraca przyszłą wartość inwestycji na podstawie stałej stopy procentowej).
Pozwalają na manipulację danymi przy użyciu różnych okresów, takich jak dni, miesiące, kwartały czy lata. Na ich podstawie można tworzyć i porównywać wartości w wybranych odcinkach czasowych. W tej funkcji zawsze jedna z tabel zawierających daty powinna być oznaczona jako tabela dat. Przykłady: DATEADD (zwraca tabelę z przesuniętymi datami do przodu lub do tyłu o określoną liczbę interwałów), LASTDATE (zwraca ostatnią datę dla określonej kolumny dat), FIRSTNONBLANK (zwraca pierwszą nie pustą wartość z danej kolumny).
Do tej grupy możemy zaliczyć funkcje, które wykonują unikatowe akcje, przez co nie da się ich zdefiniować żadną z powyższych kategorii. Do takich funkcji należą:
Prawie każdy model danych zawiera pewną część obliczeń opartych na datach. Istnieje wiele funkcji DAX, które znacznie ułatwiają takie obliczenia, pod warunkiem, że model zawiera w sobie tabelę kalendarza. Bez niej nie będziemy w stanie tworzyć jakichkolwiek agregacji czy porównań.
Niektóre funkcje analizy czasowej są predefiniowane i zawierają w sobie typowe obliczenia, takie jak: DATESYTD (obliczenia od początku roku), DATESMTD (obliczenia od początku miesiąca) itp.
Natomiast wraz z rozbudowywaniem modelu danych, funkcje te nie są już wystarczające do zaspokojenia potrzeb odbiorców i każdy deweloper DAX powinien dysponować wiedzą, jak budować miary analizy czasowej.
Ogólną zasadą tworzenia takich miar przy pomocy języka DAX jest budowa wyrażenia, które będzie odpowiednio manipulowało kontekstem filtra w ustalony przez nas sposób. Obliczenia następują w dwóch krokach:
CALCULATE (
SUMX (Sprzedaż, Sprzedaż [Wartość Netto] * Sprzedaż [Ilość] ),
DATESYTD ( ‘Tabela dat’ [Data] )
)
Odbiorcy raportów równie często potrzebują uzyskać zagregowane wartości dla analogicznych okresów roku poprzedniego. Do tego używamy funkcji SAMEPRIODLASTYEAR (ten sam okres w poprzednim roku. Miara taka wyglądałaby następująco:
CALCULATE(
[Sprzedaż],
SAMEPERIODLASTYEAR ( ‘Tabela dat’ [Data] )
)
Przydatną funkcjonalnością analizy czasowej jest też możliwość łączenia funkcji. Przykładem użycia może być poniższa:
CALCULATE(
[Sprzedaż],
SAMEPERIODLASTYEAR (DATESYTD ( ‘Tabela dat’ [Data] ) )
)
Dane panelowe w statystyce i ekonometrii to wielowymiarowe dane. Dotyczą zazwyczaj tych samych podmiotów, a ich wyniki śledzone są w konkretnych punktach w czasie. Przykładem modelu danych panelowych może być zestaw danych zawierający sprzedaż wielu produktów na przestrzeni lat, kwartałów czy miesięcy. Stworzenie wspomnianego modelu dla typowego przedsiębiorstwa nie stanowi dużego wyzwania w Power BI. Do jego budowy wystarczy prawidłowa architektura, tzn. podział tabel na fakty i wymiary oraz połączenie ich odpowiednimi relacjami.
Następnie według najlepszych praktyk należy stworzyć miarę, która zsumuje sprzedaż.
Finalny efekt zawiera Rodzaj Produktu w wierszach, Rok w kolumnach oraz miarę [Sprzedaż] jako wartość.
Liczba produktów oraz zakresów czasu jest w zasadzie nieograniczona. Jedyne na co musimy zwrócić uwagę, to czy widoczność wizualizacji będzie czytelna dla odbiorcy końcowego. Warto w takiej sytuacji stworzyć dodatkowe filtry i używać ich w razie potrzeby.
https://learn.microsoft.com/pl-pl/dax/dax-overview
Kompletny przewodnik po DAX. Analiza biznesowa przy użyciu Microsoft Power BI, SQL Server Analysis Services i Excel – wydanie 2 2019 – Russo Marco, Ferrari Alberto
Baza danych – AdventureWorksDW2019