List.ContainsAny Archive | THE SELF-SERVICE-BI BLOG Wir lieben Microsoft Power BI Mon, 14 Apr 2025 07:28:03 +0000 de hourly 1 https://wordpress.org/?v=6.8 https://ssbi-blog.de/wp-content/uploads/2019/10/Favicon-150x150.png List.ContainsAny Archive | THE SELF-SERVICE-BI BLOG 32 32 Wie Du Spalten in Power Query dynamisch nach Werten filterst https://ssbi-blog.de/blog/business-topics/wie-du-spalten-in-power-query-dynamisch-nach-werten-filterst/ https://ssbi-blog.de/blog/business-topics/wie-du-spalten-in-power-query-dynamisch-nach-werten-filterst/#comments Tue, 04 Jun 2019 11:28:22 +0000 https://ssbi-blog.de/?p=5423 Eine wesentliche Transformation in Power Query ist das Filtern von Tabellen. Um diesen Vorgang dynamisch und flexibel zu gestalten, zeige ich Dir in diesem Beitrag, wie Du Spalten in Power Query dynamisch nach Werten filterst: basierend auf Listen. Als Abonnent meines Newsletters erhältst Du die Beispieldateien zu den Beiträgen dazu. Hier geht’s zum Abonnement des […]

Der Beitrag Wie Du Spalten in Power Query dynamisch nach Werten filterst erschien zuerst auf THE SELF-SERVICE-BI BLOG.

]]>
Eine wesentliche Transformation in Power Query ist das Filtern von Tabellen. Um diesen Vorgang dynamisch und flexibel zu gestalten, zeige ich Dir in diesem Beitrag, wie Du Spalten in Power Query dynamisch nach Werten filterst: basierend auf Listen.

Als Abonnent meines Newsletters erhältst Du die Beispieldateien zu den Beiträgen dazu. Hier geht’s zum Abonnement des Newsletters!

Die Anforderung

Ich habe eine Datenbasis in Excel, von der nicht alle Werte für mich relevant sind. Ich möchte diese Daten daher in Power Query importieren und auf die relevanten Werte einschränken. Eine Tabelle mit einer Auflistung der relevanten Buchstaben (das ist eine Spalte in der Datenbasis) befindet sich in derselben Exceldatei und erlaubt es dem Nutzer den Filter durch manuelle Eintragungen in die Exceltabelle, dynamisch zu steuern. Somit kann die Datenbasis beliebig eingeschränkt werden. Im Anschluss führt die Power Query-Abfrage eine Gruppierung durch, die je Buchstaben die Summe über alle Werte bildet. Der folgende Screenshot zeigt wie die Datenbasis (Input) durch die in der Filtertabelle (Filter) aufgelisteten Buchstaben den Output beeinflusst.

Den Output durch manuell gesetzte Filter dynamisch beeinflussen, Power Query, Power BI
Den Output durch manuell gesetzte Filter dynamisch beeinflussen

Bevor ich mich an die Umsetzung mache, zunächst ein paar Vorüberlegungen.

Vorüberlegung

Für das dynamische Filtern von Spalten in Tabellen gibt es, wie so häufig, mehr als einen Lösungsansatz. Beispielsweise wird an dieser Stelle gern mit Inner Joins zwischen der Inputtabelle und der Filtertabelle gearbeitet. Dies ist sicherlich ein valider Weg, dennoch möchte ich an dieser Stelle eine Listen-basierte Lösung heranziehen und zwar aus folgenden Gründen:

  • Das Ergebnis eines Inner Joins ist schlussendlich immer eine Ergebnistabelle, auch falls diese leer sein sollte. Es wird also immer eine zusätzliche Spalte erzeugt, die ich am Ende wieder lösche, weil ich nur indirekt am Ergebnis des Inner Joins interessiert bin. Ich möchte nicht auf das Ergebnis des rechten Tabelle zugreifen, sondern lediglich die Datenmenge der linken Tabelle auf diejenigen Datensätze einschränken, die beim Schlüsselkriterium (Buchstabe) die gleichen Werte aufweisen.
Ein Join führt immer zu einer zusätzlichen Spalte, die für das Filtern jedoch nicht benötigt wird. Power Query, Power BI
Ein Join führt immer zu einer zusätzlichen Spalte, die für das Filtern jedoch nicht benötigt wird.
  • Ich habe vor kurzem einen einführenden (englischsprachigen, aber dennoch – so glaube ich – leicht zu verstehenden) Beitrag über lists in M geschrieben. Ich habe mir vorgenommen diesen Beitrag mit mehr praktischen Beispielen zu ergänzen, um die Möglichkeiten von Power Query noch mehr herauszuarbeiten. Schauen wir uns also die Lösung mittels dynamischer Listen an.

Die Lösung

Ausgangssituation ist, dass ich sowohl die zu filternden Werte, als auch die Filtertabelle in Power Query importiert habe. Da ich die Filtertabelle in Form einer dynamischen Liste als Spaltenfilter nutzen möchte, muss ich die importierte Filtertabelle zunächst in eine Liste konvertieren:

Die Filtertabelle in eine Liste konvertieren

Das Konvertieren einer (einspaltigen) Tabelle in eine Liste geht über die Nutzeroberfläche von Power Query ganz einfach:

So konvertierst Du die Filtertabelle in eine Liste, Power Query, Power BI
So konvertierst Du die Filtertabelle in eine Liste

Diese Liste erhält die Bezeichnung GesetzteFilter_Liste. Mit der nun vorhandenen Liste geht es weiter auf dem Weg zur fertigen Lösung.

Integration des dynamischen Spaltenfilters in 3 Schritten

Ich untergliedere die Erstellung meiner Lösung in 3 Schritte, die ich in den folgenden Absätzen erläutern werde.

Einen manuellen Spalten-Filter setzen

Indem ich eine manuellen Filter über die Nutzeroberfläche setze, erhalte ich gleich die richtige Syntax für die Funktion Table.SelectRows(), die ich für meine Listen-basierte Lösung benötige. Warum sich also das Leben mit händisch erzeugtem M-Code schwer machen 😉 Die folgende Animation zeigt, wie der Filter manuell zu setzen ist:

Schreibaufwand sparen: Der manuell gesetzte Filter liefert mir die korrekte Syntax für Table.SelectRows(), die ich nun anpassen kann, Power Query, Power BI
Schreibaufwand sparen: Der manuell gesetzte Filter liefert mir die korrekte Syntax für Table.SelectRows(), die ich nun anpassen kann

Nachdem ich nun die korrekte Syntax für das Selektieren von Datensätzen auf Basis des Buchstabens A vorliegen habe, geht es ans Modifizieren des M-Codes in der Bearbeitungsleiste. Wer die Bearbeitungsleiste nicht sehen kann, kann diese über Ansicht LayoutBearbeitungsleiste einblenden.

Integration der Funktion List.ContainsAny()

Der Ausdruck Table.SelectRows(#Gänderter Typ", each (Buchstabe] = "A")) filtert die bestehende Tabelle #"Geänderter Typ" in Spalte Buchstabe auf den Wert A. Dies ist eine gute Ausgangssituation für den Code, den ich nun erzeugen muss, um nicht auf den fixen Wert A, sondern auf Basis der dynamischen Liste zu filtern. Diese Liste wird im Anschluss auf Basis von Einträgen im Excelsheet durch den Nutzer angepasst.

Anpassung des manuell gesetzten Filters: Dynamisches Filtern mit List.ContainsAny(), Power Query, Power BI
Anpassung des manuell gesetzten Filters: Dynamisches Filtern mit List.ContainsAny()

Um mein Ziel (zumindest erst einmal teilweise) zu erreichen, wandle ich ([Buchstabe] = "A") zu List.ContainsAny(GesetzteFilter_Liste, [Buchstabe]). Während der erste Filterausdruck fix nach dem Wert A filtert, soll mein alternativer Ausdruck den in der Spalte Buchstabe befindlichen Wert mit Einträgen in meiner in Excel gepflegten Liste abgleichen. Die Funktion List.ContainsAny(list to check, list of values to check for)ist dafür die richtige Funktion. Der erste Parameter der Funktion muss eine Liste von Werten sein, welche die Werte beinhaltet, nach denen gesucht werden soll. Der zweite Parameter muss eine Liste von Werten sein, in denen nach den Werte des ersten Parameters gesucht wird. Für die vorliegende Problematik nutze ich die Funktion also wie folgt:

  1. Parameter: Hier setze ich meine dynamische Liste GesetzteFilter_Liste ein, denn diese beinhaltet die Werte, nach denen ich suchen möchte.
  2. Parameter: Hier kommt der Wert aus der Spalte Buchstabe rein, denn in diesen möchte ich danach suchen, ob hier ein Wert auftaucht, der auch in meiner dynamischen Liste (die im ersten Parameter angegeben wurde) enthalten ist.

Setze ich die Lösung wie eben beschrieben um, erhalte ich jedoch leider trotzdem folgende Fehlermeldung:

Fehlermeldung: Power Query erwartet eine Liste, erhält jedoch nur den Buchstaben "B", Power BI
Fehlermeldung: Power Query erwartet eine Liste, erhält jedoch nur den Buchstaben „B“

Was ist hier passiert? Wie Du im Screenshot sehen kannst, gibt die Fehlermeldung zurück, dass „B“ nicht in eine Liste konvertiert werden kann. Was bedeutet das? Nun ja, die Funktion List.ContainsAny() benötigt für die ersten beiden Parameter – wie bereits erwähnt – Werte vom Typ list. Dies trifft auf die Liste GesetzteFilter_Liste zu. Allerdings ist der Verweis auf die Spalte [Buchstabe] nicht vom Typ list. Hier wird auf den ersten Wert (in diesem Falle der Buchstabe „B“) verwiesen und bemängelt, dass „B“ nicht den Typ list aufweist. Hier kann jedoch sehr einfach nachgearbeitet werden 😉

Behebung des List-Problems

Es gibt diverse Möglichkeiten, Listen zu erzeugen. Wer sich hier im Detail belesen möchte, den verweise ich auf meinen Beitrag über lists in M. Eine dieser Möglichkeiten ist die Verwendung der sog. list-Initialisierungs-Syntax: {}. Damit wird aus der Spalte [Buchstabe] die Liste {[Buchstabe]} – auch wenn diese nur einen einzigen Wert beinhaltet – und schon arbeitet die Funktion wunschgemäß:

So erzeugst Du eine Liste: Die list-Initialisierungs-Syntax, Power Query, Power BI
So erzeugst Du eine Liste: Die list-Initialisierungs-Syntax: {}

Damit ist das wesentliche Problem gelöst und alle weiteren Schritte (wie beispielsweise das Gruppieren) sind einfach zu bewältigen.

Bis zum nächsten Mal und denk dran: Sharing is caring. Wenn Dir der Beitrag gefallen hat, dann teile ihn gerne. Falls Du Anmerkungen hast, schreibe gerne einen Kommentar, oder schicke mir eine Mail an lars@ssbi-blog.de

Viele Grüße aus Hamburg,

Lars

Der Beitrag Wie Du Spalten in Power Query dynamisch nach Werten filterst erschien zuerst auf THE SELF-SERVICE-BI BLOG.

]]>
https://ssbi-blog.de/blog/business-topics/wie-du-spalten-in-power-query-dynamisch-nach-werten-filterst/feed/ 11