Funktionen, wie beispielsweise SumX, CountX, MaxX und viele andere geben dem Nutzer die Möglichkeit statt einer Tabelle einen Filter zu übergeben. Was aber macht diese Funktion Filter()?

Ein Beispiel:

Nehmen wir die folgenden Rohdaten: image Wir möchten wissen, wie viele Packstücke wir pro Spedition versendet haben (Achtung: Uns ist bewusst, dass das viel einfacher geht - wir möchten es trotzdem einmal mit berechneten Feldern ausprobieren). Die reine Summe der Packstücke können wir mit SUM() berechnen. Für die Einschränkung auf die jeweilige Spedition benötigen wir SumX():

  • P_UPS := SUMX(FILTER('Aufträge'; 'Aufträge'[Spediteur]="UPS");[Packstücke]) P_DHL := SUMX(FILTER('Aufträge'; 'Aufträge'[Spediteur]="DHL");[Packstücke])
  • usw.

Auf Basis dieser berechneten Felder können wir folgende, zugegebenermaßen sehr einfache Pivot-Tabelle erstellen: einfache Pivot Tabelle

Die Filter()-Funktion

DAX-Funktionen, die wir bisher betrachten haben, hatten immer einen einfachen Rückgabewert – beispielsweise die Summe einer Spalte. Filter() agiert anders: Filter() gibt eine ganze Tabelle zurück, und zwar eine Tabelle, die berechnet wird. Die Signatur von Filter lautet:

=  Filter(
; ) Die Funktion Filter() ist ein Iterator, d.h. er durchläuft die ihm im ersten Parameter übergebene Tabelle und prüft, ob die Zeile gültig gemäß dem im zweiten Parameter übergebenen Ausdruck ist. Wenn ja, wird die Zeile Teil einer neuen Tabelle, die am Ende mit allen gültigen Zeilen an den Aufrufer zurückgegeben wird. Für das berechnete Feld P_UPS werden daher nur Zeilen zurückgegeben, die im Feld Spedition den Wert UPS haben. Diese Zeile wird an SUMX() übergeben und die Werte dieser neuen, temporären Tabelle werden aufsummiert.

Filter und der Kontext

Die obige Pivot-Tabelle ist ziemlich einfach – wir nehmen daher in die Auswertung noch den Monat des Versanddatums auf: komplexere Pivot Tabelle Hier wird eine Eigenschaft der Funktion Filter() deutlich: Filter operiert auch auf dem aktuellen Kontext. Das bedeutet ein Filter wird immer zusätzlich gesetzt. Oder anders gesagt: Ein Filter schränkt den aktuellen Kontext immer weiter ein. Das Ergebnis der Zelle Januar/P_UPS sind also alle Packstücke aller Sendungen, die mit UPS transportiert wurden UND im Januar versandt wurden.

Mehr Dynamik in die Filter!

Eine Maßzahl pro Spediteur... ist nicht optimal. Was, wenn ein Spediteur hinzukommt? Wer denkt daran, die neue Maßzahl anzulegen? Machen wir den Filter dynamischer! Wir haben gerade gelernt, dass Filter() im aktuellen Kontext ausgewertet wird. Also ergänzen wir einfach den Kontext um den Spediteur (beispielsweise durch einen Slicer) und definieren die Maßzahl wie folgt:

P_DYN gibt jetzt die Anzahl Packstücke aller Spediteure wieder, die laut aktuellem Kontext ausgewählt sind. Lassen Sie sich nicht irritieren vom Filter-Ausdruck 'Aufträge'[Spediteur] = 'Aufträge'[Spediteur] - das klingt wie 1=1 oder A=A. Auf der linken Seite steht immer die Spalte, mit der die aktuelle Zeile, die der Filter durchläuft, verglichen werden soll. Auf der rechten Seite der aktuelle Wert – dieser wird durch den Kontext festgelegt und kann aus einem oder mehreren (eindeutigen!) Werten bestehen. In unserem Fall vergleichen wir also nicht mit allen Zeilen der Tabelle Aufträge, sondern mit allen eindeutigen Spediteuren, die laut aktuellem Kontext überhaupt verfügbar sind. Ist kein Kontext gesetzt, erhalten wir als Rückgabe alle Zeilen. Unsere Pivot-Tabelle sieht nun wie folgt aus: erweiterte Pivot-Tabelle Man sieht erstens, dass die Maßzahlen für DHL, GLS und FedEx im gesetzten Kontext natürlich keine Werte zurückliefern. Und, dass der Wert von P_DYN mit P_UPS übereinstimmt – was so gewollt ist. Der Vorteil dieser Darstellung ist, dass man im Datenschnitt auch zwei Spediteure auswählen kann, die in P_DYN einfach zusammengezählt werden. Und kommt ein neuer Spediteur hinzu, taucht dieser einfach im Slicer auf.

Fazit

Filter sind sehr mächtig – man kann Filter aus kaskadieren, d.h. statt einer

einen weiteren in einen bestehenden Filter einsetzen. Das wird aber unter Umständen schnell unübersichtlich. Natürlich kann man die Ergebnisse des hier vorgestellten Beispiels auch anders errechnen/darstellen. Filter werden besonders im Umfeld der Calculate-Funktion verwendet – und dort ist ein gutes Verständnis von Filtern absolut notwendig. Die Calculate-Funktion betrachten wir in einem anderen Artikel.