#20 – CALCULATE() w DAX

Funkcja CALCULATE() jest jedną z podstawowych funkcji w DAX, która pozwala na modyfikowanie kontekstu filtrowania w tabelach danych. Może być ona używana do uwzględniania dodatkowych filtrów lub do usuwania istniejących filtrów, a także do tworzenia obliczeń związanych z wieloma tabelami.

Więc jak wygląda ta funkcja?:

CALCULATE( <wyrażenie>, <filtr1>, <filtr2>, ...)
  • <wyrażenie> jest wyrażeniem, które jest obliczane na podstawie nowego kontekstu filtrowania. Może to być zarówno prosta funkcja liczbowa, jak SUM, COUNT, jak i też referencja do innej tabeli, czy komórki
  • filtr1, filtr2, ... są opcjonalnymi filtrami, które są aplikowane do kontekstu filtrowania.

Przykład użycia funkcji CALCULATE():

=CALCULATE( SUM( Zamówienia[Ilość]), Zamówienia[Kategoria] = "Meble")

W tym przykładzie, funkcja CALCULATE() jest używana do obliczenia sumy wartości z kolumny [Ilość] z tabeli ”Zamówienia’, ale tylko dla wierszy, które spełniają warunek „Kategoria” = „Meble”.

Funkcja CALCULATE() jest szczególnie przydatna do tworzenie skomplikowanych obliczeń kiedy w jednym wyrażeniu chcemy wykorzystać dane z kilku tabel lub do przekształcania filtrowania.

Funkcja ta posiada też inne ciekawe możliwości takie jak np. możliwość dodawania filtrów, odejmowania filtrów itp, które pozwala na tworzenie bardzo złożonych formuł.

CALCULATE() w działaniu

Tradycyjnie otwórzmy plik do którego zaimportowaliśmy nasze dane i wstawmy na kanwę tabelę z Rokiem, Miesiącem i 'Transakcje'[Cena do zapłaty]

I teraz, dzięki CALCULATE() możemy te wartości z [Cena do zapłaty] filtrować poza samym kontekstem daty w którym są one przedstawione w tabeli.

Stwórzmy nową miarę:

Cena do zapłaty styczeń = CALCULATE ( 
    SUM ( Transakcje[Cena do zapłaty] ),
        MONTH ( Transakcje[Data podpisania umowy] ) = 1 
    )

Ta miara oblicza sumę ceny do zapłaty tylko dla stycznia każdego roku.

Jeżeli dodamy ją sobie do naszej tabeli – to zobaczysz, że te wartości będą puste dla pozostałych miesięcy.

W tym przykładzie używamy tylko jednego filtra, ale nic nie stoi na przeszkodzie aby było ich więcej – dzięki temu będziesz w stanie dokładnie sterować obliczeniami, które będą wykonywane.

Stwórzmy nową miarę, dzięki której obliczymy wartość tylko dla kwietnia 2019 roku:

Cena kwiecień 2019 = 
VAR __Rok = 2019
VAR __Miesiac = 4
RETURN
    CALCULATE (
        SUM ( Transakcje[Cena do zapłaty] ),
        YEAR ( Transakcje[Data podpisania umowy] ) = __Rok,
        MONTH ( Transakcje[Data podpisania umowy] ) = __Miesiac
    )

Zastosowanie operatorów logicznych

W CALCULATE() możemy również używać operatorów logicznych. Sprawdźmy ich działanie filtrując naszą sumę tylko do miesięcy lipiec i sierpień każdego roku.

Transakcje lipiec sierpień = 
VAR __Miesiac1 = 7
VAR __Miesiac2 = 8
RETURN
    CALCULATE (
        SUM ( Transakcje[Cena do zapłaty] ),
        MONTH ( Transakcje[Data podpisania umowy] ) = __Miesiac1 ||
        MONTH ( Transakcje[Data podpisania umowy] ) = __Miesiac2
    )

I jak widzisz – dla każdego roku mamy obliczoną cenę do zapłaty tylko dla lipca i sierpnia.

Oczywiście – w tych wszystkich obliczeniach musimy brać pod uwagę jeszcze kontekst obliczenia i to, że w zależności od agregacji na wizualizacji będą wyświetlały się różne wartości.

W funkcji CALCULATE() możemy nie tylko dodawać nowe filtry. Możemy również pomijać istniejące.

W jaki sposób do tego podejść?

Na początek skorzystajmy z funkcji ALL() wewnątrz CALCULATE() i obliczmy sumę całkowitą sumę [Cena do zapłaty]

Wartość całość ALL =
CALCULATE ( SUM ( Transakcje[Cena do zapłaty] ), ALL ( Transakcje ) )
Wykorzystanie ALL() wewnątrz CALCULATE()

Dzięki tej funkcji obliczyliśmy sumę całkowitą z kolumny 'Transakcje'[Cena do zapłaty] pomijając inne filtry.

Możemy też wykorzystać zamiast ALL() ALLEXCEPT(). W tym przypadku możemy sterować tym, jakie filtry i jaki kontekst powinny jednak być brane pod uwagę podczas wyświetlania wyniku.

Załóżmy, że chcemy obliczyć tę samą sumę ale w kontekście roku. Czyli dla każdego roku, niezależnie od miesiąca ma być wyświetlana suma z całego okresu.

Wartość ALLEXCEPT rok = 
CALCULATE (
    SUM ( Transakcje[Cena do zapłaty] ),
    ALLEXCEPT ( Kalendarz, Kalendarz[Rok] )
)

Czy to było przydante?

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Join Us!

Custom Sidebar

You can set categories/tags/taxonomies to use the global sidebar, a specific existing sidebar or create a brand new one.