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: 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:
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(Filter und der Kontext
Die obige Pivot-Tabelle ist ziemlich einfach – wir nehmen daher in die Auswertung noch den Monat des Versanddatums auf: 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: 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
Kommentar hinterlassen
ich verzweifle fast an einem (wahrscheinlich banalen Problem) Ausgangsdatei hat ca 200 Spalten Gesamt
Jede Spalte repräsentiert einen verbrauchswert / Je Arbeitsplatz (ca 80 Spalten)
Nun möchte ich einfach je ZEILE die gesamtsumme bilden um die Entscheidung treffen zu können: Ist ein positiver Wert auf diesem Arbeitsplatz (EGAL welcher!) so soll es in die Betrachtung einfliessen Wenn nicht dann exkludiert.
Mit dieser Formel:
=Tabelle2[14480410]+Tabelle2[14480420]+Tabelle2[14480500] (die Nummern in eckigen Klammern sind 3 der ca 80 Arbeitsplätze) Rechnet powerPivot richtig aus. Nun möchte ich das aber per Summenformel machen, da ich sonst ca 80 Spalten mit "+" verknüpfen müsste
Kann ich Powerpivot sagen, dass bestimmte Spalten nur JE ZEILE addiert werden? So in Etwa: SUM([14480410] : [14480500] Jeder versuch mit SUM oder SUMX bringt mir leider fehler
Vielen Dank im Voraus......
Gruß Marius Hofer
Wenn ich Ihr Problem verstanden habe: Arbeitsplatz | Kennzahl1 | Kennzahl2 | Kennzahl3 | ...
Und nun suchen Sie nach der Summe aller Kennzahlen, also der Summe über alle Spalten - das geht nicht.
Bauen Sie Ihre Tabelle so auf: Arbeitsplatz | Kennzahltyp | WertDerKennzahl
Dann können Sie leicht den Wert pro Arbeitsplatz in einer PivotTabelle in Excel kalkulieren (einfach den AP in die Spalten oder Zeile nehmen und die Werte summieren).
Da mir die Weiterberechnung natürlich nicht klar ist und Sie die Werte vielleicht so brauchen, wie Sie sie haben möchten (also Kennzahl in Spalten), verwenden Sie PowerQuery. Dort machen Sie den Aufbau, wie ich gesagt habe (also pro AP/Kennzahl eine Spalte). Dann pivotieren Sie dort und aggregieren die Summe in eine neue Spalte. Dann haben sie das Ergebnis in PowerPivot zur Weiterverarbeitung.
Bringt Sie das weiter?
Grüße Holger Gubbels
Leider habe ich die Originaldatei übernommen und muss jetzt die Daten so gut es geht aufbereiten.
Habe es mit meinen Testdaten Ausprobiert. Jetzt klappt es.
Herzlichen Dank und ein schönes Wochenende....
Gruß Marius Hofer
Ich wünsche Ihnen ein schönes Wochenende
Gruß Marius Hofer