DAX
📊 DAX
Was ist DAX?
Data Analysis Expressions (kurz DAX) ist die Formelsprache hinter Power BI und Microsoft Fabric.
Mit DAX kann man:
- Berechnete Spalten, Measures und berechnete Tabellen mit intuitiver Syntax dem Datenmodell hinzufügen
- Mit leistungsstarken und flexiblen Funktionen über die Möglichkeiten traditioneller Formeln hinaus im relationalen Datenmodell arbeiten
- Zeit-Intelligenz-Analysen, dynamische Aggregationen und kontextabhängige Berechnungen umsetzen, die in reinem SQL aufwändig wären
🧩 Wo wird DAX verwendet?
DAX-Formeln können an drei Stellen im Datenmodell stehen:
| Wo | Wann verwenden | Beispiel |
|---|---|---|
| Calculated Column | Wert pro Zeile, der dauerhaft im Modell gespeichert wird | Vollname zusammensetzen aus Vorname + Nachname |
| Measure | Aggregations-Berechnung, die je Visual / Filter neu berechnet wird | Umsatz Year-to-Date, Anzahl offener Incidents |
| Calculated Table | Eine komplette neue Tabelle aus DAX-Logik | Kalendertabelle generieren mit CALENDAR(...) |
⚖️ Calculated Columns vs. Measures — der wichtigste Unterschied
| Aspekt | Calculated Column | Measure |
|---|---|---|
| Berechnung erfolgt | beim Datenrefresh, einmal pro Zeile | zur Anzeigezeit, je Visual und Filterkontext |
| Speicherort | im Datenmodell (verbraucht RAM) | nur die Formel ist gespeichert |
| Kontext | nutzt den Row Context | nutzt den Filter Context |
| Filter-reaktiv? | Nein — Wert ist fix | Ja — Wert ändert sich mit Slicer/Visual |
| Typische Verwendung | Kategorisieren, Klassifizieren, Anreichern | KPIs, Aggregationen, dynamische Werte |
| Performance | gut bei statischen Werten, RAM-Last | sehr effizient, kein Speicher-Overhead |
Faustregel: Im Zweifel ein Measure. Eine Calculated Column nur dann, wenn der Wert pro Zeile fest sein muss und nicht von Filtern abhängt.
🎯 Row Context vs. Filter Context
Die zwei zentralen DAX-Konzepte. Wer diese versteht, beherrscht 80 % aller DAX-Schwierigkeiten.
Row Context
Der Row Context ist „die aktuelle Zeile". Existiert automatisch in:
- Calculated Columns (über jede Zeile der Tabelle)
- Iterator-Funktionen mit X-Suffix (SUMX, AVERAGEX, FILTER, …)
Vollname = [Vorname] & " " & [Nachname]
Filter Context
Der Filter Context ist „die aktuelle Filter-Situation" — definiert durch Slicer, Page-Filter, Zeilen-/Spalten-Beschriftungen in Matrixen, Visual-Filter. Existiert in Measures.
Umsatz = SUM(Sales[Amount])
// Wenn Filter "Quartal = Q1" gesetzt: nur Q1-Zeilen summieren
Mit CALCULATE kann man den Filter Context gezielt verändern — das ist die mächtigste DAX-Funktion überhaupt.
🔢 DAX-Operatoren
Arithmetische Operatoren
| Operator | Bedeutung | Beispiel |
|---|---|---|
| + | Addition | 2 + 7 |
| - | Subtraktion | 5 - 3 |
| * | Multiplikation | 2 * 6 |
| / | Division | 4 / 2 |
| ^ | Exponent | 2 ^ 5 |
Vergleichsoperatoren
| Operator | Bedeutung | Beispiel |
|---|---|---|
| = | ist gleich | [City] = "Wien" |
| > | größer als | [Quantity] > 10 |
| < | kleiner als | [Quantity] < 10 |
| >= | größer als oder gleich | [Unit_Price] >= 2.5 |
| <= | kleiner als oder gleich | [Unit_Price] <= 2.5 |
| <> | nicht gleich | [Country] <> "Deutschland" |
Text- und logische Operatoren
| Operator | Bedeutung | Beispiel |
|---|---|---|
| & | verkettet zwei Stringwerte zu einem String | [City] & " " & [State] |
| && | "Und"-Verknüpfung zwischen zwei logischen Ausdrücken | ([State]="MA") && ([Quantity]>10) |
| || | "Oder"-Verknüpfung zwischen zwei logischen Ausdrücken | ([State]="MA") || ([Quantity]>10) |
| IN | "Oder"-Verknüpfung basierend auf einer Liste | 'Store Lookup'[State] IN {"MA", "CT", "NY"} |
🧮 Wichtige DAX-Funktionen nach Kategorie
Aggregations-Funktionen
| Funktion | Zweck | Beispiel |
|---|---|---|
| SUM | Summe einer Spalte | SUM(Sales[Amount]) |
| AVERAGE | Mittelwert | AVERAGE(Sales[Amount]) |
| COUNT | Anzahl numerischer Werte | COUNT(Sales[OrderID]) |
| COUNTROWS | Anzahl Zeilen einer Tabelle | COUNTROWS(Sales) |
| DISTINCTCOUNT | Anzahl eindeutiger Werte | DISTINCTCOUNT(Sales[CustomerID]) |
| MIN / MAX | Minimum / Maximum | MAX(Sales[Date]) |
Iterator-Funktionen (X-Suffix)
Iteratoren berechnen pro Zeile (Row Context) und aggregieren am Ende. Hilfreich bei Werten, die zeilenweise berechnet werden müssen.
| Funktion | Zweck | Beispiel |
|---|---|---|
| SUMX | Summe einer berechneten Spalte zur Laufzeit | SUMX(Sales, Sales[Quantity] * Sales[Price]) |
| AVERAGEX | Mittelwert einer berechneten Spalte | AVERAGEX(Products, Products[Cost] * 1.2) |
| COUNTX | Anzahl Nicht-Leerwerte | COUNTX(Sales, Sales[Discount]) |
| MAXX / MINX | Max/Min einer berechneten Spalte | MAXX(Sales, Sales[Quantity] * Sales[Price]) |
Filter-Funktionen
| Funktion | Zweck | Beispiel |
|---|---|---|
| CALCULATE | Filter Context gezielt verändern | CALCULATE(SUM(Sales[Amount]), Sales[Country]="AT") |
| FILTER | Tabelle nach Bedingung filtern | FILTER(Sales, Sales[Amount] > 1000) |
| ALL | alle Filter einer Tabelle/Spalte entfernen | CALCULATE(SUM(Sales[Amount]), ALL(Sales)) |
| ALLEXCEPT | alle Filter außer den genannten entfernen | CALCULATE(SUM(Sales[Amount]), ALLEXCEPT(Sales, Sales[Year])) |
| REMOVEFILTERS | moderner als ALL für Filter-Removal | CALCULATE(SUM(Sales[Amount]), REMOVEFILTERS(Sales[Country])) |
Logik-Funktionen
| Funktion | Zweck | Beispiel |
|---|---|---|
| IF | Bedingte Berechnung | IF([Umsatz] > 1000, "Hoch", "Niedrig") |
| SWITCH | Mehrere Bedingungen, lesbarer als verschachteltes IF | SWITCH(TRUE(), [X]>100, "A", [X]>50, "B", "C") |
| IFERROR | Fehlerbehandlung | IFERROR([Quotient], 0) |
Zeit-Intelligenz-Funktionen
| Funktion | Zweck | Beispiel |
|---|---|---|
| TOTALYTD | Year-to-Date | TOTALYTD([Umsatz], 'Kalender'[Datum]) |
| SAMEPERIODLASTYEAR | gleicher Zeitraum letztes Jahr | CALCULATE([Umsatz], SAMEPERIODLASTYEAR('Kalender'[Datum])) |
| DATEADD | Datum verschieben | DATEADD('Kalender'[Datum], -1, MONTH) |
| DATESBETWEEN | Datumsbereich | DATESBETWEEN('Kalender'[Datum], DATE(2024,1,1), DATE(2024,12,31)) |
Beziehungs-Funktionen
| Funktion | Zweck | Beispiel |
|---|---|---|
| RELATED | Wert aus verwandter Tabelle holen (1:N-Richtung) | RELATED(Customer[Country]) in Sales |
| RELATEDTABLE | Verwandte Tabelle als Filter-Tabelle (N:1-Richtung) | RELATEDTABLE(Sales) in Customer |
| USERELATIONSHIP | Inaktive Beziehung aktivieren | CALCULATE([Umsatz], USERELATIONSHIP('Kalender'[Datum], Sales[ShipDate])) |
💡 Praktische Beispiele
Beispiel 1: Anzahl offener Incidents
CALCULATE(
COUNTROWS(sdmincident),
sdmincident[Status] <> "Closed"
)
Use Case: KPI-Karte „Wieviele Tickets sind aktuell offen?"
Beispiel 2: Umsatz Year-over-Year-Vergleich
VAR UmsatzAktuell = [Umsatz]
VAR UmsatzVorjahr = CALCULATE([Umsatz], SAMEPERIODLASTYEAR('Kalender'[Datum]))
RETURN
DIVIDE(UmsatzAktuell - UmsatzVorjahr, UmsatzVorjahr)
Use Case: Spalte „Wachstum ggü. Vorjahr" in einem Trendvisual.
Beispiel 3: Top-N-Logik
CALCULATE(
[Umsatz],
TOPN(10, ALL(Customer), [Umsatz], DESC)
)
Use Case: „Welcher Anteil des Gesamtumsatzes entfällt auf die zehn größten Kunden?"
Beispiel 4: Bedingte Klassifizierung (Calculated Column)
SWITCH(TRUE(),
Sales[Amount] >= 10000, "Gross",
Sales[Amount] >= 1000, "Mittel",
Sales[Amount] >= 100, "Klein",
"Mikro"
)
Use Case: Sales-Zeilen klassifizieren, um sie in Slicern und Gruppierungen zu nutzen.
📐 Best Practices
Variablen verwenden
Variablen mit VAR ... RETURN machen DAX-Code lesbarer und schneller (Wert wird nur einmal berechnet).
Gewinn-Marge = ([Umsatz] - [Kosten]) / [Umsatz]
// Besser: Variable
Gewinn-Marge =
VAR Umsatz = [Umsatz]
VAR Gewinn = Umsatz - [Kosten]
RETURN
DIVIDE(Gewinn, Umsatz)
DIVIDE statt /
DIVIDE(A, B) behandelt Division durch 0 sicher (gibt BLANK zurück). Der Operator / wirft Fehler.
Sprechende Measure-Namen
Measure-Namen klar und durchgängig benennen — „Umsatz YTD", „Anzahl offener Incidents", nicht „Measure 1".
CALCULATE als zentrales Werkzeug
90 % aller nicht-trivialen Measures nutzen CALCULATE. Wer CALCULATE beherrscht, beherrscht DAX.
Iteratoren sparsam
Wenn die Spalte schon im Modell steht: SUM, nicht SUMX. Iteratoren erst, wenn der Wert zeilenweise neu berechnet werden muss.
🔗 Vertiefung
- Measures — Details zu Measures
- Datenmodell — Beziehungen verstehen
- Kalendertabelle — Zeit-Intelligenz aktivieren
- Nützliche Ressourcen — Bücher, Kurse, DAX-Patterns-Website
Verwandte Themen
Kuratiert — kann direkt im Editor ergänzt werden://
- Aktualisierung von Queries
- Bedingte Spalten (Conditional Columns)
- Berechnete Spalten (Calculated Columns)
Automatisch vorgeschlagen über gemeinsame Tags (powerbi, anleitung):
- Externe User in Power BI
- Aktualisierung von Queries
- Bedingte Spalten (Conditional Columns)
- Berechnete Spalten (Calculated Columns)
- Datenmodell
- Drillthrough
Status: Migriert — Team-Review ausstehend · Owner: (festlegen) · Letzter Review: 2026-06-11