top of page

Power BI: Spaß mit DAX

Aktualisiert: 4. Juni

Das Geheimnis von Power BI liegt in DAX (Data Analysis Expressions) – einer Formelsprache, mit der Sie dynamische Berechnungen und erweiterte Analysen in Ihren Berichten erstellen können. Wenn Sie schon einmal Excel-Formeln verwendet haben, wird Ihnen DAX vertraut vorkommen (stellen Sie es sich wie Excel-Formeln auf Steroiden vor!), aber es ist für das relationale Datenmodell und die interaktiven Visualisierungen von Power BI konzipiert. Kurz gesagt: DAX ermöglicht Power BI-Benutzern, Rohdaten mit benutzerdefinierten Berechnungen in aussagekräftige Erkenntnisse umzuwandeln, die weit über vorgefertigte Kennzahlen hinausgehen. Laut Microsoft ist „DAX eine Sammlung von Funktionen, Operatoren und Konstanten, die in einer Formel oder einem Ausdruck verwendet werden können, um einen oder mehrere Werte zu berechnen und zurückzugeben“. Mit DAX können Sie aus bereits in Ihrem Modell vorhandenen Daten neue Informationen gewinnen – beispielsweise das prozentuale Wachstum über Produktkategorien hinweg analysieren oder Jahrestrends berechnen, die mit einfachen Visualisierungen allein nicht dargestellt werden können. Über 200 DAX-Funktionen decken alles ab, von einfachen Summen und Durchschnittswerten bis hin zu komplexen Filter- und Zeitintelligenzberechnungen. In diesem Blogbeitrag tauchen wir in die DAX-Syntax ein, erkunden viele nützliche DAX-Funktionen (mit zahlreichen Beispielen!) und geben Tipps zum Schreiben von effizientem DAX. Der Ton ist informativ, aber locker – also schnappen Sie sich einen Kaffee und lassen Sie uns gemeinsam Spaß mit DAX haben!


DAX-Syntax und -Struktur auf den Punkt gebracht


Bevor wir uns mit den spezifischen Funktionen befassen, machen wir uns mit der DAX-Syntax und dem Schreiben von DAX in Power BI vertraut. DAX-Formeln beginnen immer mit einem Gleichheitszeichen (=) und werden typischerweise für Kennzahlen oder berechnete Spalten in Ihrem Datenmodell geschrieben. Eine Kennzahl ist eine dynamische Berechnung (wie „Gesamtumsatz“ oder „Jahreswachstum “), die basierend auf dem Berichtskontext (Filter, Slicer usw.) ausgewertet wird. Gleichzeitig berechnet eine berechnete Spalte einen Wert für jede Zeile einer Tabelle (und wird im Modell gespeichert). Wir werden uns hauptsächlich auf Kennzahlen konzentrieren, da diese für die meisten Analysen die wichtigste Grundlage darstellen.

Grundlegende DAX-Formelstruktur: MeasureName = Eine einfache Maßnahme könnte beispielsweise sein:

Total Sales = SUM(Sales[SalesAmount])

Die Kennzahl „ Total Sales“ summiert die Spalte „SalesAmount“ in der Tabelle „Sales“. Die Syntaxelemente umfassen den Kennzahlnamen („Total Sales“), das Gleichheitszeichen und eine DAX -Funktion („SUM“) mit ihren Argumenten in Klammern (hier übergeben wir die Spalte „Sales[SalesAmount]“ als Argument) . DAX verwendet vollqualifizierte Spaltenverweise (TableName[ColumnName]), wie bei „Sales[SalesAmount]“.

Der Kontext ist entscheidend: Im Gegensatz zu Excel, wo Formeln üblicherweise einen festen Zellbereich berechnen, werden DAX-Kennzahlen je nach Bericht in unterschiedlichen Filterkontexten ausgewertet. Wenn Sie beispielsweise den Gesamtumsatz in einem Diagramm nach Land darstellen, berechnet die Kennzahl die Summe der Umsatzbeträge für jedes Land . Wenn Sie den Bericht nach einem bestimmten Jahr filtern, berücksichtigt die Kennzahl diesen Filter automatisch. Dieses dynamische Verhalten macht DAX (und Power BI) so leistungsstark.


Das Kontextmenü einer Datenanalysesoftware zeigt verschiedene Optionen wie „Neue Kennzahl“ und „Neue Spalte“ an. Die Menü- und Verkaufsdatenfelder sind hervorgehoben.
 Creating a new measure in Power BI

Sie können eine Kennzahl hinzufügen, indem Sie mit der rechten Maustaste auf eine Tabelle in der Liste „Felder“ klicken (oder die Schaltfläche „Start“ > „Neue Kennzahl“ ). Geben Sie der Kennzahl einen Namen und schreiben Sie Ihre DAX-Formel in die angezeigte Formelleiste. Im obigen Beispiel haben wir „Gesamtumsatz“ erstellt, indem wir „Gesamtumsatz = SUMME(Umsatz[Umsatzbetrag])“ geschrieben haben. Nach der Erstellung wird die Kennzahl im Bereich „Felder“ (mit einem Taschenrechnersymbol ∑) unter der ausgewählten Tabelle angezeigt.


Power BI-Schnittstelle mit der Formelleiste „Measure =", Feldoptionen auf der rechten Seite und der Meldung „Erstellen Sie Visualisierungen mit Ihren Daten“ auf weißem Hintergrund.
The DAX formula bar in Power BI Desktop

Wenn Sie eine Kennzahl erstellen oder bearbeiten, können Sie in der Formelleiste (rot hervorgehoben) DAX eingeben. Sie können IntelliSense (Autovervollständigen) verwenden, um während der Eingabe Funktionen und Spalten zu finden. Beginnen Sie mit Ihrem Kennzahlnamen und dem Gleichheitszeichen in der Formelleiste und erstellen Sie dann den Ausdruck. Sie können den Code zur besseren Lesbarkeit sogar mit Zeilenumbrüchen formatieren (drücken Sie Alt+Eingabe für eine neue Zeile in der Formelleiste). Das Schreiben von DAX fühlt sich ähnlich an wie das Schreiben einer Formel in Excel, aber denken Sie daran, dass DAX bei Funktionsnamen nicht zwischen Groß- und Kleinschreibung unterscheidet (z. B. funktionieren SUM oder Sum gleich) und Sie auf Tabellen/Spalten nach Namen verweisen. Sobald Sie das Häkchen setzen oder die Eingabetaste drücken, validiert Power BI die Formel. Wenn ein Syntaxfehler vorliegt (z. B. eine fehlende Klammer), erhalten Sie eine Fehlermeldung, um ihn zu beheben.

Nachdem wir nun die Grundlagen abgedeckt haben, wollen wir einige der nützlichsten DAX-Funktionen erkunden und sehen, wie sie Ihre Power BI-Analyse verbessern können!


Wesentliche DAX-Funktionen und Beispiele


DAX verfügt über eine umfangreiche Funktionsbibliothek . Wir stellen einige der am häufigsten verwendeten und leistungsstärksten Funktionen für fortgeschrittene Anwender vor. Jede Funktion löst ein anderes Problem – von der Steuerung des Filterkontexts über die Iteration über Tabellen bis hin zur Ausführung bedingter Logik. Wir erklären für jede Funktion ihre Funktionsweise und geben eine Beispielformel an.


  • CALCULATE – Der Filterkontext-Magier

Wenn DAX einen König hätte, wäre es CALCULATE . Die CALCULATE-Funktion wertet einen Ausdruck in einem modifizierten Filterkontext aus . Einfach ausgedrückt: CALCULATE kann eine vorhandene Kennzahl oder einen Ausdruck verwenden und Filter darauf anwenden (oder Filter überschreiben), um unter bestimmten Bedingungen etwas zu berechnen. Die Funktion ist unglaublich leistungsstark für die Definition von Kennzahlen wie „Umsatz für eine bestimmte Region“ oder „Umsatz ohne ein bestimmtes Produkt“.

Was es tut: CALCULATE akzeptiert mindestens zwei Parameter: CALCULATE( ,

Beispiel: Angenommen, wir möchten eine Kennzahl für den Absatz blauer Produkte , die nur die Umsätze für Produkte mit der Farbe „Blau“ summiert. Wir können Folgendes schreiben:

Blue Sales = CALCULATE( SUM(Sales[SalesAmount]), 'Product'[Color] = "Blue" )

Hier ist SUM(Sales[SalesAmount]) der Ausdruck und 'Product'[Color] = "Blue" eine Filterbedingung. Diese Kennzahl ignoriert alle Verkäufe außer denen, bei denen die Produktfarbe Blau ist. Sie könnten „Blaue Verkäufe“ in einer Visualisierung verwenden, die immer die Verkäufe blauer Produkte anzeigt, unabhängig von anderen Filtern für die Produktfarbe. Tatsächlich hat CALCULATE den Filterkontext geändert , sodass nur blaue Produkte für diese Berechnung berücksichtigt werden. Wie in der Microsoft-Dokumentation erläutert, fügt CALCULATE Filter hinzu oder überschreibt sie. Wenn der Bericht bereits einen Filter für die Produktfarbe enthielt, würde der Filter von CALCULATE diesen für diese Kennzahl ersetzen.

Eine weitere Stärke von CALCULATE ist die Durchführung von Kontextübergängen : Bei Verwendung in einem Zeilenkontext (z. B. innerhalb einer berechneten Spalte oder eines Iterators) kann die aktuelle Zeile automatisch in einen Filterkontext umgewandelt werden. Dies ist ein fortgeschrittenes Konzept, aber CALCULATE ist die einzige Funktion, die Filter auf diese Weise ändern kann. Deshalb wird sie in vielen DAX-Mustern verwendet.

Zusammenfassend lässt sich sagen: CALCULATE ist die ideale Lösung für die Definition von Kennzahlen mit speziellen Filterbedingungen oder Berechnungen, die vom alltäglichen Kontext abweichen. CALCULATE wird in Kombination mit vielen anderen Funktionen verwendet (darunter einige unten).


  • FILTER – Tabellen dynamisch aufteilen

Mit der FILTER -Funktion in DAX können Sie eine Teilmenge von Zeilen aus einer Tabelle abrufen. FILTER ist eine Tabellenfunktion (d. h. sie gibt eine Ergebnistabelle zurück, keinen einzelnen Wert). Die Syntax lautet FILTER( ). Das Ergebnis ist eine Tabelle mit nur den Zeilen aus , (was ein boolescher Testausdruck ist). die den gegebenen

Wann FILTER verwendet wird: FILTER wird häufig in anderen Funktionen verwendet, die eine Tabelleneingabe erfordern. Ein typisches Muster verwendet FILTER innerhalb von CALCULATE, um komplexere Filter als einfache Gleichheit anzuwenden. Beispielsweise können Sie eine Umsatztabelle so filtern, dass „nur Transaktionen über 1000 $“ berücksichtigt werden, und diese anschließend summieren.

Beispiel: Angenommen, wir möchten Verkäufe mit hohem Wert berechnen (Verkäufe, bei denen jede Transaktion über 1.000 $ liegt). Wir könnten Folgendes tun:

High Value Sales = CALCULATE( SUM(Sales[SalesAmount]), FILTER( Sales, Sales[SalesAmount] > 1000 ) )

Hier ergibt FILTER(Sales, Sales[SalesAmount] > 1000) eine gefilterte Tabelle mit nur den Umsatzdatensätzen mit einem Betrag > 1000. CALCULATE summiert dann den SalesAmount über diese gefilterte Tabelle. Dieses Muster (CALCULATE + FILTER) eignet sich für die Anwendung beliebiger Bedingungen.

Wichtig zu beachten: FILTER erstellt beim Durchlaufen der Tabelle einen Zeilenkontext , ist aber im Allgemeinen nicht so optimiert wie die Verwendung einfacher Filterargumente in CALCULATE. Bei einfachen Filterbedingungen (z. B. eine einzelne Spalte entspricht einem Wert oder IN einer Liste) ist die direkte Verwendung in CALCULATE möglicherweise schneller. Für Bedingungen mit Kennzahlen oder komplexerer Logik ist FILTER jedoch die beste Wahl.

Ein weiteres Beispiel ohne CALCULATE: Sie können auch FILTER verwenden, um eine berechnete Tabelle zu erstellen. Beispielsweise könnte eine neue berechnete Tabelle mit VIP-Kunden wie folgt definiert werden: VIP-Kunden = FILTER(Kunden, Kunden[Gesamtumsatz] > 100000). Dies würde eine Tabelle mit Kunden mit Umsätzen über 100.000 ergeben (vorausgesetzt, der Gesamtumsatz wird pro Kunde berechnet).

Denken Sie daran, dass FILTER (und andere Tabellenfunktionen) in einen Kontext eingebettet sein müssen, der eine Tabelle erwartet – Sie können FILTER nicht einfach allein in einen Bericht einfügen. Deshalb wird es häufig innerhalb von CALCULATE oder Iteratoren wie SUMX verwendet. Außerdem können mehrere Bedingungen in FILTER mit && (UND) oder || (ODER) kombiniert werden, wie beispielsweise in FILTER(Sales, Sales[Region]="North" && Sales[Year]=2023).


  • SUMX (und die X-Familie) – Zeilenweise Iteration

Als Nächstes folgen die X-Funktionen wie SUMX, AVERAGEX, MAXX, MINX usw. Das X zeigt an, dass diese Funktionen eine Iteration über eine Tabelle durchführen, einen Ausdruck für jede Zeile auswerten und anschließend die Ergebnisse aggregieren. SUMX ist die bekannteste Funktion und wird verwendet, um einen Ausdruck über eine Tabelle zu summieren.

Was SUMX macht: SUMX( ) geht Reihe für Reihe durch die , für jede Zeile und gibt dann die Summe aller Ausdruckswerte zurück. Es handelt sich um eine , bewertet die

Einsatzzweck: Verwenden Sie SUMX, um etwas zu summieren, das nicht als einfacher Spaltenbezug ausgedrückt werden kann. Beispielsweise die Summierung eines berechneten Werts wie „Preis x Menge“ für jede Zeile oder „Umsatz x Kosten pro Zeile“. Die reguläre SUM()-Funktion (ohne X) ist effizienter, wenn Sie eine einfache Spaltensumme benötigen. SUMX eignet sich für Fälle, in denen eine direkte SUM nicht ausreicht.

Beispiel: Angenommen, unsere Verkaufstabelle hat separate Spalten für Einzelpreis und Menge und wir möchten den Gesamtumsatz (Einzelpreis x Menge) ermitteln. Wir können Folgendes schreiben:

Total Revenue = SUMX( Sales, Sales[UnitPrice] * Sales[Quantity] )

Dadurch wird der Einzelpreis mit der Menge in jeder Zeile der Verkaufstabelle multipliziert und alle Ergebnisse addiert, um den Gesamtumsatz zu ermitteln. Würden wir dies nur mit SUM versuchen, müssten wir zunächst eine berechnete Spalte (Einzelpreis * Menge) erstellen und diese dann summieren. Mit SUMX ist dies ohne eine gespeicherte Spalte möglich.

Ein weiteres Beispiel: Der Durchschnittspreis könnte AVERAGEX(Sales, Sales[UnitPrice]) sein, wodurch der Einzelpreis effektiv über alle Verkäufe gemittelt wird (unter Berücksichtigung des aktuellen Filterkontexts für Verkaufszeilen).

Beachten Sie, dass Iteratoren wie SUMX bei großen Tabellen langsamer sein können als entsprechende integrierte Aggregationen. Bevorzugen Sie immer eine Nicht-X-Funktion, wenn diese das gleiche Ergebnis erzielt. Beispielsweise ist SUM(Sales[SalesAmount]) schneller als SUMX(Sales, Sales[SalesAmount]), da die Engine die direkte Spaltensumme optimieren kann. Verwenden Sie X-Funktionen, wenn Sie diese zeilenweise Berechnungslogik benötigen.


  • ALLE – Filter ignorieren (für Gesamtsummen und mehr)

Die Funktion ALL ist ein Filtermodifikator , der alle Tabellenzeilen- oder Spaltenwerte zurückgibt und dabei eventuell angewendete Filter ignoriert. Anders ausgedrückt: Mit ALL können Sie Filter entfernen . CALCULATE verwendet die Funktion häufig, um den aktuellen Filterkontext für bestimmte Spalten oder Tabellen zu überschreiben.

Verwendung: ALL(Tabelle) gibt alle Zeilen der angegebenen Tabelle zurück, und ALL(Tabelle[Spalte]) gibt alle Werte dieser Spalte zurück und ignoriert dabei alle Filter dieser Spalte. Es gibt auch verwandte Funktionen wie ALLSELECTED (berücksichtigt nur Filter außerhalb der Visualisierung und ignoriert die innerhalb der Visualisierung) und ALLEXCEPT (entfernt alle Filter außer den angegebenen).

Wann wird „ALL“ verwendet: Ein häufiges Szenario ist die Berechnung von Prozentsätzen einer Summe. Wenn Sie beispielsweise „% des Gesamtumsatzes“ berechnen möchten, benötigen Sie möglicherweise den Zähler für den Umsatz im aktuellen Kontext (z. B. die aktuelle Region oder das aktuelle Produkt) und den Nenner für alle Kontexte (Gesamtumsatz). „ALL“ hilft beim Nenner, indem Filter gelöscht werden. Eine weitere Anwendung ist die Erstellung von Kennzahlen, die unabhängig von Filtern einen konstanten Wert anzeigen (z. B. ein Ziel oder ein Gesamt-Benchmark).

Beispiel: Kennzahl „% des Gesamtumsatzes “:

Total Sales = SUM(Sales[SalesAmount]) -- base measure % of Total Sales = DIVIDE( [Total Sales], CALCULATE([Total Sales], ALL(Sales)) )

Hier berechnet CALCULATE([Gesamtumsatz], ALL(Umsatz)) den Gesamtumsatz, wobei alle Filter aus der Umsatztabelle entfernt werden – praktisch den Gesamtumsatz. DIVIDE liefert dann den aktuellen Kontextumsatz geteilt durch den Gesamtumsatz. Das Ergebnis ist ein Prozentsatz, der beispielsweise den Beitrag jedes Produkts zum Gesamtumsatz zeigt. Wenn ein Bericht nach einer Region gefiltert ist, entspricht der Zähler dem Umsatz dieser Region, während der Nenner (dank ALL) weiterhin alle Gebiete berücksichtigt.

Ein weiteres Beispiel: Einen bestimmten Filter ignorieren . Wenn Sie eine Kennzahl haben, die nur den Filter „Produktkategorie“ ignorieren, andere aber berücksichtigen soll, können Sie ALL(Produkt[Kategorie]) in CALCULATE verwenden. Beispiel: Kategorie ignorierte Verkäufe = CALCULATE( [Gesamtumsatz], ALL(Produkt[Kategorie]) ). Dadurch werden alle Slicer oder Filter für die Kategorie bei der Berechnung des Gesamtumsatzes entfernt, Filter für andere Dimensionen wie Region oder Datum werden aber weiterhin berücksichtigt.

Zusammenfassend lässt sich sagen: ALL ist Ihr Freund, wenn Sie den aktuellen Filterkontext verlassen müssen. Gehen Sie dabei jedoch vorsichtig vor – wenn Sie zu viele Filter entfernen, könnten Sie versehentlich etwas Unerwünschtes berechnen. Normalerweise kombinieren Sie ALL mit bestimmten Spalten oder Tabellen, die für Ihre Berechnung sinnvoll sind.


  • RELATED – Werte aus verwandten Tabellen nachschlagen

Die Funktion RELATED wird in DAX verwendet, um einen Wert aus einer anderen Tabelle abzurufen, die mit der aktuellen Tabelle verknüpft ist. Sie arbeitet im Zeilenkontext (wie berechnete Spalten oder Iteratoren), um eine Suche basierend auf vorhandenen Beziehungen in Ihrem Datenmodell durchzuführen. Wenn Sie mit SVERWEIS in Excel oder LOOKUPVALUE in DAX (ähnlich) vertraut sind, ist RELATED die einfache Möglichkeit, einen Wert aus einer Nachschlagetabelle abzurufen.

Wann Sie RELATED verwenden sollten: Am häufigsten verwenden Sie RELATED in einer berechneten Spalte . Angenommen, Sie haben eine Verkaufstabelle, die mit einer Produkttabelle verknüpft ist, und Sie möchten eine berechnete Spalte in den Verkaufszahlen für die Produktkategorie. In diesem Fall können Sie RELATED verwenden, um die Kategorie aus der Produkttabelle in jede Verkaufszeile zu ziehen. RELATED funktioniert, wenn eine 1:n-Beziehung (oder Eins-zu-eins-Beziehung) vorliegt und Sie sich auf der „n“-Seite befinden und versuchen, Daten von der „1“-Seite zu erhalten. In die andere Richtung funktioniert es nicht (dafür würden Sie RELATEDTABLE oder andere Techniken verwenden).

Beispiel: Stellen Sie sich eine Produkt-Nachschlagetabelle (eine Zeile pro Produkt mit Spalten wie „Produktname“, „Kategorie“ und „Preis“) und eine OrderDetails-Tabelle (mehrere Zeilen mit jeweils einer Produkt-ID) vor. Wenn wir in OrderDetails eine Spalte für die Kategorie jedes verkauften Produkts wünschen, könnten wir Folgendes schreiben:

Category = RELATED(Product[Category])

Dabei wird die ProductID der aktuellen Zeile betrachtet, die Beziehung zur Product-Tabelle verfolgt und der entsprechende Category-Wert zurückgegeben.

Eine weitere alltägliche Verwendung: Wenn Sie eine Datumstabelle und eine Auftragstabelle (mit einem Datumsschlüssel) haben, kann eine berechnete Spalte in Aufträgen für OrderYear = RELATED(Dates[Year]) das Jahr aus der Datumstabelle abrufen.

Obwohl RELATED für berechnete Spalten äußerst nützlich ist, verwenden wir RELATED normalerweise nicht – Kennzahlen werden im Filterkontext und nicht im Zeilenkontext ausgewertet. Daher greifen Sie auf verknüpfte Tabellen normalerweise über Kennzahlen oder Aggregatfunktionen zu, anstatt über zeilenweise Nachschlagevorgänge. RELATED dient eher der Modellierung, um eine Tabelle mit Nachschlageinformationen anzureichern. Wenn Sie einen Nachschlagevorgang in einer Kennzahl benötigen, können Sie Funktionen wie LOOKUPVALUE verwenden (die einen Wert anhand bestimmter Schlüssel abrufen kann) oder die Beziehung über CALCULATE-Filter nutzen.


  • WERTE – Einzigartige Werte im Kontext

Die Funktion VALUES gibt eine einspaltige Tabelle mit den eindeutigen Werten einer Spalte zurück, gefiltert nach dem aktuellen Kontext. Sie wird häufig verwendet, um entweder den einzelnen Wert im aktuellen Kontext abzurufen (wenn ein Wert gefiltert wird) oder um andere Funktionen zu versorgen, die eine Werteliste benötigen.

Typischer Anwendungsfall: Prüfen Sie, ob ein Kontext nur einen Wert enthält, und rufen Sie diesen ab. Beispielsweise möchten Sie in einer Maßnahme den aktuell ausgewählten Produktnamen abrufen (wenn ein einzelnes Produkt gefiltert wird). Traditionell würden Sie beispielsweise IF(HASONEVALUE(Produkt[Name]), VALUES(Produkt[Name]), "Mehrere") verwenden. Die Funktion HASONEVALUE() gibt TRUE zurück, wenn genau ein Wert im Kontext für diese Spalte vorhanden ist. In Kombination mit VALUES erhalten Sie diesen einen Wert. Microsoft hat sogar eine einfachere Funktion SELECTEDVALUE eingeführt, die dieses Muster umschließt (wir werden sie später bei weniger bekannten Funktionen erwähnen).

Beispiel: Ausgewählte Länderumsätze – Stellen Sie sich vor, Sie möchten eine Kennzahl, die die Umsätze für das aktuell ausgewählte Land (aus einem Slicer) anzeigt. Sie könnten schreiben:

Selected Country Sales = IF( HASONEVALUE(Geography[Country]), CALCULATE( [Total Sales], FILTER(Geography, Geography[Country] = VALUES(Geography[Country])) ), BLANK() )

Das sieht etwas kompliziert aus, aber es funktioniert folgendermaßen: Wenn genau ein Land ausgewählt ist, wird der Gesamtumsatz für dieses Land berechnet (mithilfe eines Filters oder direkt mit Geography[Country] = VALUES(Geography[Country]) in CALCULATE). Bei mehreren ausgewählten Ländern wird BLANK zurückgegeben (oder je nach Bedarf ein Aggregat für alle). In diesem Muster gibt VALUES(Geography[Country]) einen einzelnen Wert (das Land) zurück, wenn eines ausgewählt ist.

VALUES(Spalte) gibt grundsätzlich die eindeutigen Werte des aktuellen Kontexts zurück. Bei Verwendung in einem Kontext mit mehreren Werten (z. B. in einer Summenzeile mit mehreren Kategorien) wird eine Tabelle dieser Werte zurückgegeben. Ist kein Zeilenkontext vorhanden (z. B. eine Kennzahl in einer Kartenvisualisierung ohne Filter), gibt VALUES alle eindeutigen Werte dieser Spalte im gesamten Modell zurück. Dies kann beispielsweise für dynamische Titel (Auflistung ausgewählter Elemente) oder Berechnungen wie eindeutige Zählungen nützlich sein (DAX verfügt jedoch über eine einfachere Funktion DISTINCTCOUNT für diesen Zweck).

Wichtig: Wenn keine Zeilen im Kontext vorhanden sind (z. B. nichts gefiltert ist), gibt VALUES alle unterschiedlichen Werte zurück. Wenn Sie nur dann etwas erfassen möchten, wenn ein Wert vorhanden ist, kombinieren Sie VALUES() sicherheitshalber immer mit HASONEVALUE() oder verwenden Sie SELECTEDVALUE, das dies für Sie erledigt.


  • SWITCH – Vereinfachung der bedingten Logik

SWITCH ist die Antwort von DAX auf eine Case/Switch-Anweisung (ähnlich wie SWITCH in Excel oder eine Reihe von IFs). Es ermöglicht Ihnen, einen Ausdruck auszuwerten und basierend auf übereinstimmenden Werten unterschiedliche Ergebnisse zurückzugeben. Dies ist äußerst nützlich für die Bucketing-Logik oder die Auswahl von Berechnungen basierend auf einem Parameter.

Syntax: SWITCH( ,

Wann Sie SWITCH verwenden sollten: SWITCH ist übersichtlicher, wenn Sie mehrere verschachtelte IFs für Gleichheitsbedingungen schreiben. Es eignet sich hervorragend für benutzerdefinierte Gruppierungen oder eine Parametertabelle, die vorgibt, welche Maßnahme angezeigt werden soll.

Beispiel: Angenommen, Sie haben ein numerisches Feld „Bewertung“ und möchten es als „Hoch“, „Mittel“ oder „Niedrig“ kategorisieren. Sie könnten Folgendes tun:

Rating Category = SWITCH( TRUE(), Data[Rating] >= 90, "High", Data[Rating] >= 75, "Medium", Data[Rating] >= 0, "Low", "Unknown" )

Dieses Beispiel verwendet den SWITCH(TRUE(), ...), ein typisches Muster für die Verarbeitung von Bereichsbedingungen. Im Wesentlichen setzen wir den Ausdruck immer auf TRUE, und dann gibt die erste Bedingung, die wahr ist, ihr Ergebnis zurück. Bei einer Bewertung >=90 wird „Hoch“ zurückgegeben; andernfalls bei >=75 (und kleiner als 90) wird „Mittel“ zurückgegeben; andernfalls bei >=0 wird „Niedrig“ zurückgegeben; andernfalls „Unbekannt“. Dies vermeidet tief verschachtelte IF-Anweisungen und ist leichter lesbar.

Eine weitere Anwendung: Angenommen, Sie haben einen Was-wäre-wenn-Parameter für die „Metrikenauswahl“, bei dem ein Benutzer 1, 2 oder 3 verschiedene anzuzeigende Metriken auswählen kann. Sie könnten eine Kennzahl schreiben:

Selected Metric Value = SWITCH( SELECTEDVALUE(Parameters[MetricChoice]), 1, [Total Sales], 2, [Total Cost], 3, [Total Profit], BLANK() )

Dadurch wird die entsprechende Kennzahl basierend auf der Auswahl zurückgegeben (vorausgesetzt, Sie verfügen über Kennzahlen für Gesamtumsatz, Gesamtkosten usw.). Dies ist eine praktische Möglichkeit, dynamische Kennzahlen oder dynamische Titel zu erstellen.

Kurz gesagt: SWITCH ist Ihr Freund für Multi-Branch-Logik. Es macht den DAX-Code lesbarer als eine Reihe von IFs und kann etwas effizienter sein.


  • WENN – Der klassische Konditional

Wir dürfen die bewährte WENN -Funktion nicht vergessen. Sie funktioniert genau wie die WENN-Funktion in Excel: WENN( ,

Anwendungsfälle: Binäre Entscheidungen in Kennzahlen oder berechneten Spalten. Beispielsweise kann eine Kennzahl wie „IsLargeCustomer = IF( SUM(Sales[SalesAmount]) > 100000, 1, 0 ) erstellt werden, um zu kennzeichnen, ob der Kontext (Kunde) einen Umsatz von über 100.000 erzielt. Oder die sichere Handhabung der Division durch Null: „IF( [Total Sales] = 0, 0, [Profit] / [Total Sales] ), um Fehler zu vermeiden.

Beispiel: Gewinnspannenmaß mit Sicherheit:

Profit Margin = IF( [Total Sales] = 0, BLANK(), [Profit] / [Total Sales] )

Wenn der Gesamtumsatz Null ist (um eine Division durch Null zu vermeiden), geben wir BLANK() zurück; andernfalls berechnen wir den Gewinn/Gesamtumsatz. Dies ist ein typisches Muster, um Kennzahlen fehlerfrei zu halten.

Obwohl IF einfach ist, ist Vorsicht geboten: Vermeiden Sie die Verkettung zu vieler IFs für mehrere Bedingungen – hier bietet SWITCH, wie bereits erwähnt, die größte Stärke. Verschachtelte IFs können schwer lesbar und schwer zu debuggen sein. Bei mehr als zwei oder drei Bedingungen sollten Sie SWITCH verwenden oder eine separate unterstützende Tabelle erstellen, um Bedingungen den Ergebnissen zuzuordnen.


  • RANKX – Dynamisches Ranking

Sie möchten eine Bestenliste erstellen? RANKX ist die Funktion zum Ranking von Elementen (Kunden, Produkten usw.) anhand bestimmter Kennzahlen. Es handelt sich um einen Iterator, der den Wert eines Elements in einer Werteliste einordnet.

Syntax: RANKX( , [ ,

Die Parameter:

  • : die Tabelle (oder Werteliste), die bewertet werden soll. Häufig wird beispielsweise ALL(Tabelle[Spalte]) verwendet, um alle Werte unter Berücksichtigung von Filtern zu bewerten, oder ALLSELECTED(Tabelle[Spalte]), um innerhalb des sichtbaren Kontexts zu bewerten.

  • : die Kennzahl oder der Ausdruck, nach dem das Ranking erfolgen soll (z. B. [Gesamtumsatz]).

  • (optional): Der Wert für den aktuellen Kontext, der bewertet werden soll. Normalerweise übergeben Sie hier aus Effizienzgründen denselben Ausdruck oder dieselbe Kennzahl.

  • (optional): Geben Sie DESC (Standard) für die Rangfolge von hoch nach niedrig (1 = höchster Wert) oder ASC für niedrig nach hoch an.

  • (optional): Wie mit Gleichständen umgegangen wird. Die Standardeinstellung ist SKIP, wodurch Lücken in den Rängen von Relationen entstehen (z. B. 1,2,2,4, wenn zwei Elemente den zweiten Platz belegen). Mit DENSE können Sie das Überspringen von Zahlen (in diesem Fall 1,2,2,3) vermeiden.

Beispiel: Produkte nach Umsatz innerhalb ihrer Kategorie sortieren. Angenommen, Sie haben in einer Visualisierung Kategorie und Produkt aufgelistet und möchten eine Kennzahl, die den Rang jedes Produkts innerhalb seiner Kategorie nach Umsatz anzeigt:

Product Rank in Category = RANKX( ALL(Products[ProductName]), -- all products (we'll filter in CALCULATE) CALCULATE( SUM(Sales[SalesAmount]) ), CALCULATE( SUM(Sales[SalesAmount]) ), DESC, DENSE )

Das ist ein bisschen knifflig: Wir verwenden ALL(Products[ProductName]), um den vollständigen Satz an Produkten bereitzustellen, die bewertet werden sollen, möchten aber innerhalb der Kategorie ranken. ALL(Products[ProductName]) allein würde über alle Kategorien hinweg ranken. Um dies innerhalb der Kategorie zu erreichen, sind wir auf den Kontext angewiesen. Angenommen, die Kategorie befindet sich im Filterkontext (wie in Zeilen). In diesem Fall wertet CALCULATE in RANKX die nach dieser Kategorie gefilterten Umsätze aus (da CALCULATE ohne explizite Filter den Kontext übernimmt, der die aktuelle Kategorie enthält). Effektiv sieht RANKX also für jede Kategorie nur Produkte in dieser Kategorie mit Umsätzen ungleich null. Jedes Produkt erhält einen Rang unter den Produkten dieser Kategorie. Wir haben das DENSE-Ranking verwendet, damit bei Gleichständen keine Zahl übersprungen wird.

Ein einfacheres Szenario: Wenn Sie eine Gesamtrangliste ohne Berücksichtigung von Filtern wünschen, können Sie Folgendes tun:

Customer Sales Rank = RANKX( ALL(Customer[CustomerName]), [Total Sales], , DESC, Dense )

Dadurch werden die Kunden nach dem Gesamtumsatz sortiert, wobei 1 der höchste Wert ist. Wenn Sie dies in eine Tabelle mit Kunden einfügen, wird der globale Rang angezeigt. Wenn Sie nach einer bestimmten Region filtern, berücksichtigt die Rangfolge (da wir ALL(CustomerName) verwendet haben) weiterhin alle Kunden (daher können die Rangnummern in der gefilterten Liste nicht fortlaufend erscheinen, da der Filter einige Ränge ausblendet).

RANKX ist leistungsstark, kann aber zunächst verwirrend sein. Der Schlüssel liegt darin, die Menge der Elemente festzulegen, die Sie bewerten möchten (das ist oft das gesamte Feld, optional mit einem Filter wie ALLEXCEPT zur Begrenzung des Umfangs) und sicherzustellen, dass der Ausdruck den Wert für jedes dieser Elemente zurückgibt.


  • Zeitintelligenzfunktionen (TOTALYTD, SAMEPERIODLASTYEAR, DATESINPERIOD usw.)

Die Stärken von DAX liegen in der Zeitintelligenz. Es gibt eine Reihe integrierter Funktionen speziell für datumsbasierte Berechnungen – wie z. B. Jahressummen, Periodenvergleiche, rollierende Perioden usw. Wir heben einige wichtige Funktionen hervor:

  • TOTALYTD : Summiert den Wert einer Kennzahl vom Jahresbeginn bis zum aktuellen Kontextdatum. Es gibt ähnliche Funktionen wie TOTALQTD (Quartal bis heute) und TOTALMTD (Monat bis heute).

  • SAMEPERIODLASTYEAR : Verschiebt einen Datumsbereich um genau ein Jahr. Wird häufig verwendet, um den Vergleichszeitraum des Vorjahres für die Jahresvergleichsanalyse zu ermitteln.

  • DATESINPERIOD : Gibt einen Datumsbereich (als Datumstabelle) mit einem Startdatum und einer Intervalllänge/-richtung zurück (z. B. 30 Tage ab einem bestimmten Datum).

Wichtig: Diese Funktionen erfordern in der Regel eine entsprechende Datumstabelle in Ihrem Modell, die als Datumstabelle gekennzeichnet ist. Für die korrekte Funktion sind fortlaufende Datumsangaben erforderlich. Normalerweise verwenden Sie eine Kalendertabelle mit Ihren Faktendaten (z. B. Umsätze) und verwenden die Datumsspalte des Kalenders in diesen Funktionen.

Sehen wir uns beides anhand eines Beispiels an:

TOTALYTD – Angenommen, wir möchten eine Kennzahl für den Umsatz seit Jahresbeginn . Angenommen, wir haben eine Kennzahl [Gesamtumsatz] und eine Datumstabelle namens „Daten“ mit der Spalte [Datum]:

YTD Sales = TOTALYTD( [Total Sales], -- expression to accumulate (sum of SalesAmount in this case) Dates[Date] -- the date column to use for the year-to-date tracking )

Diese Funktion verwendet das maximale Datum im aktuellen Filterkontext und summiert alle [Gesamtumsätze] vom Jahresbeginn bis zu diesem Datum. Wenn Sie beispielsweise die Umsätze seit Jahresbeginn in ein Monatsdiagramm für 2025 einfügen, zeigt Januar die Umsätze von Januar, Februar Jan+Feb, März Jan+Feb+Mär usw. Die Werte werden zu Beginn eines neuen Jahres zurückgesetzt.

Wenn Ihr Geschäftsjahr nicht im Dezember endet, können Sie TOTALYTD auch ein optionales drittes Argument für ein Jahresenddatum angeben.

SAMEPERIODLASTYEAR – Gibt einen Datumsbereich zurück, der dem gleichen Zeitraum ein Jahr zuvor entspricht. Wenn der aktuelle Kontext die Daten vom 1. bis 31. Januar 2025 umfasst, gibt SAMEPERIODLASTYEAR in einer korrekten Datumstabelle den Zeitraum vom 1. bis 31. Januar 2024 zurück. Diese Funktion wird häufig in CALCULATE verwendet, um beispielsweise den Umsatz des letzten Jahres zu ermitteln.

Beispielmaß für den Umsatz des letzten Jahres :

Last Year Sales = CALCULATE( [Total Sales], SAMEPERIODLASTYEAR( Dates[Date] ) )

Was dies bewirkt: CALCULATE nimmt [Gesamtumsatz] und wertet ihn in einem modifizierten Kontext aus, in dem die Daten auf das Vorjahr verschoben werden. Wenn Ihre Visualisierung also Werte für 2025 anzeigt, zeigt diese Kennzahl die Werte für 2024 direkt daneben an. Ideal für Jahresvergleiche in Diagrammen oder Tabellen. (Eine ähnliche Funktion ist DATEADD, die um beliebig viele Intervalle verschieben kann – z. B. entspricht DateAdd(Datum, -1, JAHR) effektiv dem Vorjahreszeitraum. Es gibt auch PARALLELPERIOD, um unabhängig von den aktuellen Filtern um einen Zeitraum zu verschieben.)

DATESINPERIOD – Diese Funktion ist sehr flexibel: Sie gibt eine fortlaufende Datenmenge mit einem Startdatum und einem Intervall zurück. Syntax: DATESINPERIOD( ,

Nehmen wir beispielsweise an, wir möchten eine Kennzahl für die Verkäufe der letzten 30 Tage (gleitendes 30-Tage-Fenster bis zum jeweiligen Datum). Wir könnten Folgendes tun:

Last 30 Days Sales = CALCULATE( [Total Sales], DATESINPERIOD( Dates[Date], MAX(Dates[Date]), -30, DAY ) )

Hier ermittelt MAX(Dates[Date]) das letzte Datum im aktuellen Filterkontext (z. B. wäre MAX(Date) in einer Monatsvisualisierung der letzte Tag dieses Monats). DATESINPERIOD nimmt dieses Datum als Ausgangspunkt, geht 30 Tage zurück (-30, DAY) und gibt den Datumsbereich von vor 30 Tagen bis zu diesem maximalen Datum zurück. CALCULATE summiert anschließend den Gesamtumsatz über diesen Zeitraum. Das Ergebnis: Für jedes Datum (oder jeden Monat usw.) wird die Summe der letzten 30 Tage bis zu diesem Datum angegeben. Dies ist eine gleitende Fensterberechnung für Werte wie den 30-Tage-Umsatz oder den 12-Monats-Durchschnitt (ändern Sie DAY in MONTH und verwenden Sie ggf. AVERAGEX).

Zeitintelligenzfunktionen funktionieren oft am besten in Kombination mit CALCULATE (mit Ausnahme der TOTALYTD-Funktion, die bereits intern eine Aggregation durchführt). Sie vereinfachen die sonst komplexe Filterlogik erheblich. Beachten Sie jedoch, dass sie eine Standardkalenderstruktur voraussetzen, sofern Sie kein Jahresende angeben oder benutzerdefinierte Kalender verwenden.


Tipps und Tricks zur Optimierung der DAX-Leistung


DAX zu schreiben ist eine Sache, effizientes DAX zu schreiben eine ganz andere. Komplexe DAX-Messwerte können Ihren Bericht manchmal verlangsamen, wenn sie nicht sorgfältig geschrieben sind. Hier sind einige Tipps und Best Practices für einen reibungslosen DAX-Betrieb:

  • Wiederverwendung und Vereinfachung mit Variablen und Kennzahlen: Wenn Sie denselben Unterausdruck an mehreren Stellen schreiben, sollten Sie eine eigene Kennzahl dafür erstellen oder eine DAX-Variable (VAR) verwenden. Dadurch werden redundante Berechnungen vermieden. Verwenden Sie beispielsweise VAR TotalSales = SUM(Sales[SalesAmount]) innerhalb einer Kennzahl und verweisen Sie mehrmals auf TotalSales, anstatt SUM(...) wiederholt aufzurufen. Einfachere Formeln sind nicht nur leichter zu lesen, sondern bieten auch eine bessere Leistung.

  • Vermeiden Sie zu viele berechnete Spalten: Wenn eine Berechnung in einer Kennzahl durchgeführt werden kann, sollten Sie eine Kennzahl bevorzugen. Berechnete Spalten werden bei der Datenaktualisierung für jede Zeile berechnet und im Modell gespeichert, was Ihre Daten aufblähen und die Verarbeitung verlangsamen kann. Kennzahlen hingegen werden kontextbezogen und spontan berechnet. Verwenden Sie Kennzahlen grundsätzlich für Aggregationen und Verhältnisse. Verwenden Sie berechnete Spalten nur, wenn Sie wirklich einen statischen Wert pro Zeile benötigen (vor allem, wenn dieser zum Aufteilen oder Filtern von Visualisierungen verwendet wird).

  • Intelligentes Filtern: Bei Verwendung von CALCULATE ist die Übergabe von Filterargumenten wie „Tabelle[Spalte] = Wert“ im Allgemeinen effizienter als die Verwendung einer FILTER-Funktion auf einer großen Tabelle, da die Engine diese Filter direkt anwenden kann. Verwenden Sie FILTER, wenn Sie komplexere Logik benötigen, aber verpacken Sie einfache Bedingungen nicht unnötig in FILTER. Versuchen Sie außerdem, nach Möglichkeit nach Spalten in Dimensionstabellen (wie Produkt oder Datum) zu filtern, anstatt die große Faktentabelle zu filtern – dies kann die zu scannende Datenmenge reduzieren.

  • Verwenden Sie nach Möglichkeit Aggregatoren anstelle von Iteratoren: Wie bereits bei SUMX vs. SUM erwähnt, sind die einfachen Aggregatfunktionen (SUM, AVERAGE, COUNTROWS usw.) in der VertiPaq-Engine hochoptimiert. Verwenden Sie die X-Versionen nur, wenn Sie die zeilenweise Berechnung benötigen. Verwenden Sie beispielsweise anstelle von COUNTX(Tabelle, 1) zum Zählen von Zeilen die deutlich schlankere Funktion COUNTROWS(Tabelle).

  • Vorsicht vor zu komplexen Kennzahlen in Visualisierungen: Jede Kennzahl in einer Visualisierungszelle stellt eine Abfrage dar, die ausgeführt werden muss. Wenn Sie eine einzelne Kennzahl erstellen, die viel Arbeit erfordert (z. B. viele verschachtelte Berechnungen und Aggregationen), ist das kein Problem. Bedenken Sie jedoch Szenarien mit vielen Kennzahlen oder sehr detaillierten Visualisierungen. Manchmal kann es hilfreich sein, Berechnungen aufzuteilen oder voraggregierte Daten zu verwenden. Erwägen Sie außerdem die Verwendung von Aggregationen im Datenmodell (aggregierte Tabellen) für große Datensätze, um die DAX-Belastung zur Abfragezeit zu reduzieren.

  • Optimieren Sie die Beziehungen und Kardinalität des Datenmodells: Dies ist nicht nur eine DAX-Sache, aber ein sauberes Datenmodell (Sternschema, korrekte Beziehungen, keine Spalten mit übermäßig hoher Kardinalität, wo nicht benötigt) beschleunigt die Ausführung von DAX-Formeln. Wenn Sie beispielsweise eine separate Nachschlagetabelle für Kategorien anstelle von Textwerten verwenden, die in einer großen Faktentabelle wiederholt werden, sind DAX-Berechnungen mit Filterung nach Kategorien effizienter. Gute Datenmodellierung und DAX gehen Hand in Hand.

  • Verwenden Sie Tools wie DAX Studio und Performance Analyzer: Diese helfen Ihnen, langsame Kennzahlen zu identifizieren. DAX Studio (ein externes Tool) kann die von Ihren Kennzahlen generierten Abfragen erfassen und Ihnen die Abfragepläne und -zeiten anzeigen. Der Performance Analyzer von Power BI (im Menü „Ansicht“) kann die Ausführungsdauer der einzelnen Visualisierungen und Kennzahlen aufschlüsseln. Überlegen Sie, ob Sie den DAX effizienter neu schreiben oder Daten im Voraus aggregieren können, falls etwas langsam ist.

  • Beschränken Sie den Kontext, wo immer möglich: Wenn eine Kennzahl nicht im Kontext jeder einzelnen Zeile berechnet werden muss, vermeiden Sie Konstrukte, die eine zeilenweise Auswertung erzwingen. Beispielsweise kann eine Kennzahl, die ein reines SUMMARIZE verwendet oder große Zwischentabellen generiert, langsam sein. Prüfen Sie, ob es eine Möglichkeit gibt, das Ergebnis mit einer einfacheren Filterlogik zu erreichen. Manchmal kann die Verwendung von CALCULATETABLE mit Filtern anstelle von FILTER+ALL-Kombinationen effizienter sein.

  • Testen und iterieren: Die DAX-Leistung kann manchmal unintuitiv sein. Probieren Sie alternative Ansätze aus (z. B. die Verwendung einer Variable oder die Aufteilung einer Kennzahl in zwei Teile), um die bessere Leistung zu erzielen. Testen Sie immer mit genügend Daten, um sicherzugehen.

Ein kurzes Beispiel für eine Leistungsoptimierung: Die Verwendung von DIVIDE(x,y) anstelle von x / y kann besser sein, wenn die Möglichkeit einer Division durch Null besteht, da DIVIDE ein alternatives Ergebnisargument hat und Leerzeichen effizient verarbeitet (außerdem ist es einfach sauberer, als jedes Mal ein IF zu schreiben, um auf Null zu prüfen).

Bleiben Sie außerdem über DAX-Verbesserungen auf dem Laufenden. Microsoft führt gelegentlich neue Funktionen ein, die gängige Muster vereinfachen (beispielsweise vereinfachte SELECTEDVALUE das alte HASONEVALUE/VALUES-Muster; COALESCE wurde eingeführt, um den ersten nicht leeren Wert auszuwählen usw.). Die Verwendung der neuesten geeigneten Funktion kann manchmal die Leistung oder Übersichtlichkeit verbessern.


Weniger bekannte, aber leistungsstarke DAX-Funktionen


Über die Standardfunktionen hinaus bietet DAX einige versteckte Vorteile , die fortgeschrittenen Benutzern möglicherweise noch nicht bekannt sind, die aber in den richtigen Szenarien äußerst leistungsstark sein können. Hier sind einige, die es wert sind, erkundet zu werden:

  • USERELATIONSHIP: Wenn Sie mehrere Beziehungen zwischen Tabellen haben (z. B. eine Tabelle mit Bestellungen, bei der sowohl Bestelldatum als auch Versanddatum mit der Datumstabelle verknüpft sind), kann für die automatische Filterung immer nur eine Beziehung aktiv sein. USERELATIONSHIP schafft hier Abhilfe, indem es eine inaktive Beziehung für eine bestimmte Berechnung aktiviert . Beispielsweise würde CALCULATE([Gesamtumsatz], USERELATIONSHIP(Bestellungen[Versanddatum], Daten[Datum])) den Gesamtumsatz anhand der Beziehung zum Versanddatum berechnen (vorausgesetzt, die normalerweise aktive Beziehung ist das Bestelldatum). Dadurch werden verschiedene Datumsmetriken (z. B. Bestelldatum vs. Versanddatum) im selben Modell verglichen.

  • TREATAS: Diese Funktion kann Werte als Filter auf eine andere Tabelle ohne direkte Beziehung anwenden. Es ist, als würde man im Handumdrehen eine virtuelle Beziehung erstellen. Syntax: TREATAS( , TargetTable[TargetColumn]) – Es nimmt eine Tabelle (normalerweise Werte aus einem Kontext) und behandelt sie wie Werte der Zielspalte. Beispielsweise filtert CALCULATE( [Measure], TREATAS( VALUES(Orders[ProductID]), Products[ProductID] ) ) die Tabelle „Produkte“ nach den im aktuellen Auftragskontext vorhandenen Produkt-IDs und filtert so die Kennzahlen nach diesen Produkten. TREATAS eignet sich beispielsweise für Szenarien wie die Anwendung einer Wertetabelle aus einer Datenquelle zum Filtern einer anderen oder für komplexere Tricks wie getrennte Slicer.

  • KEEPFILTERS: Standardmäßig überschreibt CALCULATE vorhandene Filter in einer Spalte, wenn Sie neue angeben. KEEPFILTERS ist ein Modifikator , der CALCULATE anweist, den Filter nicht zu überschreiben, sondern mit einem vorhandenen Filter zu kombinieren. Es handelt sich um eine erweiterte Funktion, die jedoch in bestimmten Fällen nützlich ist. Wenn Sie beispielsweise ein CALCULATE mit einem FILTER()-Element haben, ermöglicht das Umschließen der Filterbedingung mit KEEPFILTERS manchmal die Anwendung externer Filter. In der Praxis können Sie dies in Maßnahmen verwenden, bei denen eine Slicer-Auswahl einen CALCULATE-Filter weiter eingrenzen soll, anstatt ihn zu ersetzen. Es wird normalerweise nicht benötigt, aber wenn, ist es lebensrettend für korrekte Ergebnisse.

  • GENERATE und CROSSJOIN: Dies sind erweiterte Tabellenfunktionen, die Tabellenkombinationen erstellen. GENERATE kann insbesondere jede Zeile einer Tabelle mit allen Zeilen einer anderen Tabelle verknüpfen (ähnlich wie eine Kreuzkombination). Dies ist nützlich für Szenarien wie „alle möglichen Paare“ oder das Erstellen einer Tabelle mit Kombinationen, die in den Daten nicht vorhanden sind. Beispielsweise würde GENERATE(Produkte, Regionen) jedes Produkt jeder Region zuordnen (ähnlich einer kartesischen Produkttabelle). Sie können dies in einer berechneten Tabelle oder einem Iteratorszenario verwenden, um sicherzustellen, dass alle Kombinationen berücksichtigt werden. CROSSJOIN(Tabelle1, Tabelle2) bewirkt etwas Ähnliches (kartesisches Produkt zweier oder mehrerer Tabellen). Diese Funktionen eignen sich eher für die Datenexploration oder spezielle Berechnungen (sie können bei großen Tabellen sehr aufwendig sein, verwenden Sie sie daher mit Bedacht).

  • ADDCOLUMNS und SUMMARIZE: Mit diesen Funktionen können Sie virtuelle Tabellen im Handumdrehen mit neuen Spalten erstellen oder Daten gruppieren. Beispielsweise gibt SUMMARIZE(Sales, Customer[CustomerName], "TotalCustSales", SUM(Sales[SalesAmount])) eine Kundentabelle mit einer Spalte für den Gesamtumsatz zurück. Dies entspricht einem GROUP BY in SQL. In Kennzahlen können Sie manchmal SUMMARIZE oder ADDCOLUMNS verwenden, um eine Tabelle vorzubereiten und anschließend einen Iterator wie MAXX oder RANKX darauf anzuwenden. Vorsicht: Die komplexe Verwendung von SUMMARIZE/ADDCOLUMNS in Kennzahlen kann bei großen Tabellen langsam sein. Kleinere Sets oder unterstützende Tabellen bieten jedoch viel Flexibilität. (Hinweis: Für die meisten Gruppierungsaufgaben in Kennzahlen wird die Verwendung von AVERAGEX, SUMX usw. oder separaten Kennzahlen empfohlen. Es ist jedoch gut zu wissen, dass diese für Szenarien verfügbar sind, in denen Sie eine Tabelle erstellen müssen.)

  • SELECTEDVALUE: Wie versprochen vereinfacht diese Funktion das Abrufen eines einzelnen ausgewählten Werts. SELECTEDVALUE(Spalte, Alternative) gibt den Wert dieser Spalte zurück, wenn genau ein Wert im Kontext vorhanden ist, andernfalls die Alternative (oder BLANK, falls keine Alternative angegeben ist). Dies erspart Ihnen das Schreiben von IF(HASONEVALUE(Spalte), VALUES(Spalte), Alternative). Verwenden Sie SELECTEDVALUE beispielsweise für dynamische Titel (z. B. „Umsatz für“ & SELECTEDVALUE(Geografie[Land], „Alle Länder“)) oder für Parametertabellen, in denen Sie die ausgewählte Option benötigen.

  • IN-Operator: DAX verfügt über einen IN- Operator, den viele nicht kennen. Damit können Sie prüfen, ob ein Wert in einer Werteliste vorhanden ist. Beispiel: CALCULATE([Total Sales], Product[Color] IN {"Red", "Blue", "Green"}) würde die Produktfarbe auf nur diese drei Farben filtern. Das ist deutlich übersichtlicher als das Schreiben einer Reihe von ODER-Bedingungen (Product[Color]="Red" || Product[Color]="Blue" || ...). Sie können IN mit einer Liste von Literalwerten oder sogar mit einer Wertetabelle (z. B. IN VALUES(Table[Column]))) verwenden. Es ist praktisch, um Filterbedingungen zu vereinfachen.

Jede dieser Funktionen eröffnet neue Möglichkeiten für Ihre DAX-Berechnungen. Sie werden vielleicht nicht täglich genutzt, aber wenn Sie wissen, dass es sie gibt, haben Sie bei kniffligen Anforderungen mehr Werkzeuge in Ihrem DAX-Werkzeugkasten, um diese zu lösen.


Abschluss


DAX kann zunächst entmutigend wirken, macht aber Spaß und ist vorteilhaft, sobald man den Dreh raus hat. In diesem Beitrag haben wir erläutert, was DAX ist und warum es für Power BI-Benutzer so leistungsstark ist. Wir haben die Syntax und Struktur von DAX-Formeln untersucht und viele Beispiele für Kernfunktionen durchgegangen – von den allgegenwärtigen CALCULATE- und FILTER-Funktionen bis hin zu Time-Intelligence-Perlen wie TOTALYTD und SAMEPERIODLASTYEAR. Wir haben außerdem Tipps zum Schreiben von effizientem DAX gegeben (damit Ihre Berichte zügig bleiben) und uns einige weniger bekannte Funktionen angesehen, die Ihre Analyse auf die nächste Ebene bringen können.

Als fortgeschrittener Power BI-Nutzer erschließt Ihnen die Beherrschung von DAX neue Einblicke . Sie können damit Kennzahlen und Analysen erstellen, die allein per Drag & Drop nicht möglich wären. Sie möchten den heutigen Umsatz mit dem Vorjahrestag vergleichen? DAX hilft Ihnen dabei. Sie möchten Kunden nach Gewinn sortieren, bestimmte Produkte herausfiltern oder einen gleitenden 6-Monats-Durchschnitt berechnen – alles in einer einzigen Visualisierung? DAX macht es möglich. Es ist das analytische Herzstück von Power BI.

Üben und experimentieren Sie weiter mit diesen Funktionen. Erstellen Sie Ihre eigene Sandbox mit Maßnahmen und beobachten Sie, wie diese mit Filtern und Visualisierungen interagieren. Und denken Sie daran: DAX lernt man am besten durch praktische Anwendung – beginnen Sie mit Beispielen und passen Sie diese dann an Ihre Daten und Szenarien an. Sie entwickeln nach und nach ein Gespür für Kontext und die effektivsten Muster.

Wir hoffen, dieser ausführliche Einblick hat DAX leichter verständlich und zugänglicher gemacht. Mit einem fundierten Verständnis von DAX können Sie erweiterte Analysen erstellen und Erkenntnisse gewinnen wie nie zuvor. Viel Spaß mit DAX in Power BI! Viel Spaß beim Berichten!


Comentarios

Obtuvo 0 de 5 estrellas.
Aún no hay calificaciones

Agrega una calificación

© 2025 Excelized. Alle Rechte vorbehalten.

bottom of page