Konteksty wykonania w DAX
Koncepcja kontekstów wykonania pozwala na tworzenie bardziej złożonych zestawień w DAX. Konteksty stanowią podstawę wszystkich zaawansowanych funkcjonalności DAX. Konteksty wykonania stanowią ważną rolę w funkcji CALCULATE, która jest zarówno najbardziej efektywna, ale też najtrudniejsza do opanowania w DAX. Wyróżniamy dwa konteksty wykonania:
- kontekst filtru,
- kontekst wiersza.
Kontekst filtru polega na rzeczywistym filtrowaniu danych (czyli wybieranie i pomijanie danych wynika z wartości zadeklarowanych w filtrze danych), zaś kontekst wiersza dotyczy iteracji po tabelach, czyli rozmieszczenia tych danych w tabelach, a nie ich treści. Krótko mówiąc – gdy silnik DAX wykonuje wykonuje iterację, to nie filtruje i odwrotnie.
Kontekst filtru
Każde wyrażenie DAX jest przetwarzane w jakimś kontekście. Stanowi to pewnego rodzaju środowisko, w którym formuła jest obliczana. Weźmy za przykład formułę:
Sales Amount = SUMX ( financials, financials[Units Sold] * financials[Sale Price] )
Formuła oblicza sumę wszystkich wartości ilości pomnożonych przez cenę z przykładowej tabeli financials. Miarę oczywiście możemy umieścić w raporcie i zobaczyć pełną wartość sprzedaży. Pełna wartość sprzedaży może nie dawać za dużo wartości dodanej, lecz formuła oblicza dokładnie to, co zadeklarowaliśmy. W finalnym raporcie jednak możemy podzielić naszą miarę według wybranej kolumny, np. segmentu. Choć nigdzie nie wskazaliśmy w funkcji, że chcemy podzielić naszą sumę sprzedaży ze względu na segment Power BI obliczy ją zgodnie ze wskazaniem wizualizacji obliczając podsumy dla segmentów, które złożą się na całkowitą wartość sprzedaży. Oznacza to, że silnik DAX przetwarza formuły w ich kontekście, tj. jeśli formuła jest ta sama, to jej wyniki będą różne, ponieważ kod jest wykonywany wobec innych podzbiorów danych. Ten właśnie podzbiór danych nazywamy kontekstem filtru. Każda formuła DAX wskazuje jakieś obliczenie, ale następnie są one ewaluowane w kontekście, który definiuje wyliczaną wartość.
Wizualne interakcje w Power BI pozwalają na modyfikowanie kontekstu filtrów poprzez interfejs graficzny. I tak jak wskazane na poniższym zrzucie ekranu, po zaznaczeniu USA z wykresu kołowego nasza formuła, choć niezmieniona, jest obliczana w kontekście Stanów zjednoczonych, a także innych obecnie widocznych w tabelach filtrów.
Kontekst wiersza
Kontekst wiersza w przeciwieństwie do kontekstu filtru nie służy do filtrowania. Jego zadaniem jest iteracja tabeli i obliczenie wartości kolumny. Aby lepiej opisać kontekst wiersza, przyjrzyjmy się poniższemu przykładowi. Bazując na przykładowym zbiorze financials dostępnym w Power BI Desktop wyróżnimy następujące miary:
Quantity = SUM ( Units Sold )
Net Price = SUM ( Sale Price )
Unit Cost = SUM ( Manufacturing Price )
Margin = [Quantity] * ( [Net Price] – [Unit Cost] )
Następnie wybierzemy konkretny produkt i utworzymy tabelę pokazującą zestawienie liczb: Ilości sprzedanej, ceny netto, kosztu produkcji i wysokości marży.
Jak widać, dla każdego wiersza obliczona wartość jest inna. Wynika to z tego, że w każdym wierszu da się wyszczególnić wartości dla trzech kolumn użytych w wyrażeniu. Podobnie jak w przypadku kontekstu filtru przyczyną jest tutaj kontekst wykonania. Jednak polega on nie na filtrowaniu, lecz identyfikuje wiersz, dla którego wykonuje obliczenia. Kiedy tworzymy kolumnę kalkulowaną w tabeli, DAX tworzy kontekst wiersza właśnie poprzez iterację obliczanego wyrażenia wiersz po wierszu.
Kontekst wiersza występuje, gdy tworzymy kolumnę obliczeniową lub wykonujemy wyrażenie wewnątrz iteratora. Nie ma innego sposobu na utworzenie kontekstu wiersza. To bardzo ważne, ponieważ na tej podstawie możemy interpretować czy dana miara jest poprawnie zdefiniowana. Wskazana wyżej miara do obliczenia marży będzie poprawna gdy nadamy jej kontekst wiersza, natomiast podając tylko zsumowane wyrażenie wynik byłby błędny. Jak zatem dodać kontekst wiersza do obliczeń? W powyższym przypadku możemy zastosować formułę SUMX, która jest iteratorem.
Margin SUMX = SUMX (
financials,
financials[Units Sold] * ( financials[Sale Price] – financials[Manufacturing Price] )
)
Efekt obliczonego wyrażenia możemy zobaczyć poniżej.
Podsumowanie
W artykule omówiłem dwa konteksty wykonania w DAX: kontekst filtru i wiersza. DAX automatycznie tworzy kontekst wiersza dla kolumny kalkulowanej. Kontekst wiersza może zostać także wymuszony poprzez użycie iteratora. Konteksty wiersza można także zagnieżdżać.