Vermeiden der Verwendung von FILTER als Filterargument

Als Datenmodellierer ist es üblich, DAX-Ausdrücke zu schreiben, die in einem modifizierten Filterkontext ausgewertet werden müssen. Sie können z. B. eine Measuredefinition schreiben, um den Umsatz für „gewinnträchtige Produkte“ zu berechnen. Diese Berechnung wird später in diesem Artikel beschrieben.

Hinweis

Dieser Artikel ist besonders relevant für Modellberechnungen, die Filter zum Importieren von Tabellen anwenden.

Die DAX-Funktionen CALCULATE und CALCULATETABLE sind wichtige und nützliche Funktionen. Mit ihnen können Sie Berechnungen schreiben, die Filter entfernen oder hinzufügen oder Beziehungspfade ändern. Dies erfolgt durch die Übergabe von Filterargumenten, die entweder boolesche Ausdrücke, Tabellenausdrücke oder spezielle Filterfunktionen sind. In diesem Artikel werden nur boolesche und Tabellenausdrücke diskutiert.

Betrachten Sie die folgende Measuredefinition, die den Umsatz des roten Produkts mithilfe eines Tabellenausdrucks berechnet. Sie ersetzt alle Filter, die auf die Tabelle Product (Produkt) angewendet werden können.

Red Sales =
CALCULATE(
    [Sales],
    FILTER('Product', 'Product'[Color] = "Red")
)

Die Funktion CALCULATE akzeptiert einen Tabellenausdruck, der von der DAX-Funktion FILTER zurückgegeben wird, die ihren Filterausdruck für jede Zeile der Tabelle Produkt auswertet. Sie erzielt das richtige Ergebnis – das Verkaufsergebnis für rote Produkte. Dies kann jedoch mit einem booleschen Ausdruck wesentlich effizienter erreicht werden.

Im folgenden finden Sie eine verbesserte Measuredefinition, die einen booleschen Ausdruck anstelle des Tabellenausdrucks verwendet. Die DAX-Funktion KEEPFILTERS stellt sicher, dass vorhandene, auf die Spalte Color (Farbe) angewendete Filter beibehalten und nicht überschrieben werden.

Red Sales =
CALCULATE(
    [Sales],
    KEEPFILTERS('Product'[Color] = "Red")
)

Es empfiehlt sich, nach Möglichkeit Filterargumente als boolesche Ausdrücke zu übergeben. Das liegt daran, dass die Importmodelltabellen speicherinterne Columnstores sind. Sie sind explizit optimiert, um Spalten auf diese Weise effizient zu filtern.

Es gibt jedoch Einschränkungen, die für boolesche Ausdrücke gelten, wenn sie als Filterargumente verwendet werden. Einschränkungen:

  • Auf Spalten aus mehreren Tabellen kann nicht verwiesen werden.
  • Sie können nicht auf ein Measure verweisen.
  • Sie können keine geschachtelten CALCULATE-Funktionen verwenden.
  • Sie können keine Funktionen verwenden, die eine Tabelle überprüfen oder zurückgeben.

Das bedeutet, dass Sie für komplexere Filteranforderungen Tabellenausdrücke verwenden müssen.

Betrachten Sie nun eine andere Measuredefinition. Die Anforderung ist, den Umsatz zu berechnen, aber nur für die Monate, die einen Gewinn erzielt haben.

Sales for Profitable Months =
CALCULATE(
    [Sales],
    FILTER(
        VALUES('Date'[Month]),
        [Profit] > 0)
    )
)

In diesem Beispiel muss die Funktion FILTER verwendet werden. Der Grund dafür ist, dass das Measure Profit (Gewinn) bewertet werden muss, um die Monate zu beseitigen, in denen kein Gewinn erzielt wurde. Es ist nicht möglich, ein Measure in einem booleschen Ausdruck zu verwenden, wenn es als Filterargument verwendet wird.

Empfehlungen

Um eine optimale Leistung zu erzielen, empfiehlt es sich, nach Möglichkeit boolesche Ausdrücke als Filterargumente zu verwenden.

Deshalb sollte die Funktion FILTER nur bei Bedarf verwendet werden. Sie können damit auch komplexe Spaltenvergleiche filtern. Diese Spaltenvergleiche können Folgendes umfassen:

  • Measures
  • Andere Spalten
  • Verwendung der DAX-Funktion OR oder des logischen Operators OR (||)