Küss mich – ich bin ein verzaubertes Problem.
UND ist nicht UND; ODER ist nicht ODER.
Augen auf bei den logischen Konjunktoren in DAX – sie sind nicht konsistent!
Über die Funktion CALCULATE kann ein Filterkontext mitgegeben werden (oder man einen Filter auch aufheben). Allerdings leider nicht konsistent, was UND beziehungsweise ODER betrifft:
Beginnen wir mit ODER:
|| ist das Zeichen für das logische „ODER“ und kann für eine Spalte verwendet werden:
J Oder01 :=
CALCULATE (
SUM ( tbl_Kunden[Jahresbeitrag] );
tbl_Kunden[Mitgliedschaft] = "Platinum"
|| tbl_Kunden[Mitgliedschaft] = "Gold"
)
Platinum oder Gold – kein Problem! Auch die Alternative mit der Funktion OR klappt:
J Oder02 :=
CALCULATE (
SUM ( tbl_Kunden[Jahresbeitrag] );
OR (
tbl_Kunden[Mitgliedschaft] = "Platinum";
tbl_Kunden[Mitgliedschaft] = "Gold"
)
)
Filtert man jedoch über zwei verschiedene Spalten, scheitert ||:
J Oder03 :=
CALCULATE (
SUM ( tbl_Kunden[Jahresbeitrag] );
tbl_Kunden[Mitgliedschaft] = "Platinum"
|| tbl_Kunden[Jahresbeitrag] > 180
)
aber auch OR liefert einen Fehler:
J Oder04 :=
CALCULATE (
SUM ( tbl_Kunden[Jahresbeitrag] );
OR ( tbl_Kunden[Mitgliedschaft] = "Platinum"; tbl_Kunden[Jahresbeitrag] > 180 )
)
Also muss man die Funktion FILTER verwenden. Kein Problem bei ||:
J Oder05 :=
CALCULATE (
SUM ( tbl_Kunden[Jahresbeitrag] );
FILTER (
tbl_Kunden;
tbl_Kunden[Mitgliedschaft] = "Platinum"
|| tbl_Kunden[Jahresbeitrag] > 180
)
)
Allerdings versagt hier die Funktion OR:
J Oder06:=
CALCULATE(sum(tbl_Kunden[Jahresbeitrag]);FILTER(or(tbl_Kunden;tbl_Kunden[Mitgliedschaft]="Platinum" ; tbl_Kunden[Jahresbeitrag]>180 )))
OR wird nicht in der Funktion FILTER akzeptiert!
Und wie sieht bei der Verkettung zweier logischer Bedingungen mit UND aus?
J Und01 :=
CALCULATE (
SUM ( tbl_Kunden[Jahresbeitrag] );
tbl_Kunden[Jahresbeitrag] > 140
&& tbl_Kunden[Jahresbeitrag] < 180
)
&& stellt kein Problem dar. Auch die Funktion AND nicht:
J Und02 :=
CALCULATE (
SUM ( tbl_Kunden[Jahresbeitrag] );
AND ( tbl_Kunden[Jahresbeitrag] > 140; tbl_Kunden[Jahresbeitrag] < 180 )
)
Die Funktion CALCULATE bietet die Möglichkeit mehrere getrennte Bedingungen mit einem Semikolon zu trennen. Auch das klappt problemlos:
J Und03 :=
CALCULATE (
SUM ( tbl_Kunden[Jahresbeitrag] );
tbl_Kunden[Jahresbeitrag] > 140;
tbl_Kunden[Jahresbeitrag] < 180
)
Und wie sieht es bei zwei verschiedenen Spalten aus? Ähnlich wie bei ODER liefern die beiden Varianten it && und AND einen Fehler:
J Und04 :=
CALCULATE (
SUM ( tbl_Kunden[Jahresbeitrag] );
tbl_Kunden[Jahresbeitrag] > 140
&& tbl_Kunden[Mitgliedschaft] = "Gold"
)
Und auch das führt zu einem Fehler:
J Und05 :=
CALCULATE (
SUM ( tbl_Kunden[Jahresbeitrag] );
AND ( tbl_Kunden[Jahresbeitrag] > 140; tbl_Kunden[Mitgliedschaft] = "Gold" )
)
Also bleibt die Variante mit dem Semiloka – sie funktioniert:
J Und06 :=
CALCULATE (
SUM ( tbl_Kunden[Jahresbeitrag] );
tbl_Kunden[Jahresbeitrag] > 140;
tbl_Kunden[Mitgliedschaft] = "Gold"
)
Und die Funktion FILTER? Analog zu ODER klappt &&:
J Und07 :=
CALCULATE (
SUM ( tbl_Kunden[Jahresbeitrag] );
FILTER (
tbl_Kunden;
tbl_Kunden[Jahresbeitrag] > 140
&& tbl_Kunden[Mitgliedschaft] = "Gold"
)
)
AND ist im Kontext von FILTER (ebenso wie OR) verboten:
J Und08:=
CALCULATE(sum(tbl_Kunden[Jahresbeitrag]);FILTER(tbl_Kunden;and(tbl_Kunden;tbl_Kunden[Jahresbeitrag] > 140 ; tbl_Kunden[Mitgliedschaft] ="Gold")))
Und da FILTER nur ein Filterkriterium akzeptiert, führt auch die letzte Lösung zu einem Fehler:
J Und09:=
CALCULATE(sum(tbl_Kunden[Jahresbeitrag]);FILTER(tbl_Kunden;tbl_Kunden;tbl_Kunden[Jahresbeitrag] > 140 ; tbl_Kunden[Mitgliedschaft] ="Gold"))
Fazit:Man muss bei der Und- beziehungsweise Oder-Filterung gut aufpassen, welche der Varianten man verwendet.
Hier noch einmal der Screenshot mit den sechs Oder-FIlterungen und den neun Und-Filtern: