Vermeiden der Verwendung von FILTER als Filterargument
Als Datenmodellierer kommt es häufig vor, dass Sie DAX Ausdrücke 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.
Anmerkung
Dieser Artikel ist insbesondere für Modellberechnungen relevant, die Filter auf Importtabellen anwenden.
Die funktionen CALCULATE und CALCULATETABLEDAX sind wichtige und nützliche Funktionen. Sie ermöglichen es Ihnen, Berechnungen zu schreiben, die Filter entfernen oder hinzufügen oder Beziehungspfade ändern. Dazu werden Filterargumente übergeben, die entweder boolesche Ausdrücke, Tabellenausdrücke oder spezielle Filterfunktionen sind. In diesem Artikel werden nur boolesche ausdrücke und Tabellenausdrücke behandelt.
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 FILTERDAX-Funktion zurückgegeben wird, die ihren Filterausdruck für jede Zeile der Tabelle Produkt auswertet. Es erzielt das richtige Ergebnis – das Verkaufsergebnis für rote Produkte. Es könnte jedoch viel effizienter erreicht werden, indem ein boolescher Ausdruck verwendet wird.
Im folgenden finden Sie eine verbesserte Measuredefinition, die einen booleschen Ausdruck anstelle des Tabellenausdrucks verwendet. Die KEEPFILTERSDAX-Funktion 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 wird empfohlen, Filterargumente nach Möglichkeit 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.
- Geschachtelte CALCULATE-Funktionen dürfen nicht verwendet werden.
- Funktionen, die eine Tabelle scannen oder zurückgeben, können nicht verwendet werden.
Dies bedeutet, dass Sie Tabellenausdrücke für komplexere Filteranforderungen verwenden müssen.
Betrachten Sie jetzt eine andere Maßdefinition. Die Anforderung besteht darin, den Umsatz zu berechnen, aber nur für Monate, die einen Gewinn erzielt haben.
Sales for Profitable Months =
CALCULATE(
[Sales],
FILTER(
VALUES('Date'[Month]),
[Profit] > 0
)
)
In diesem Beispiel muss die FILTER-Funktion 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 Maß in einem Booleschen Ausdruck zu verwenden, wenn es als Filterargument genutzt wird.
Empfehlungen
Um eine optimale Leistung zu erzielen, empfiehlt es sich, boolesche Ausdrücke nach Möglichkeit als Filterargumente zu verwenden.
Daher sollte die FILTER-Funktion nur bei Bedarf verwendet werden. Sie können damit auch komplexe Spaltenvergleiche filtern. Diese Spaltenvergleiche können folgendes umfassen:
- Measures
- Andere Spalten
- Verwenden Sie die ORDAX-Funktion oder den logischen Operator OR (||)