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:

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.