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órkifiltr1, 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 ) )

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] )
)
