DAX

Last modified by Dimitri Rupp on 2026/06/11 09:30

📊 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:

WoWann verwendenBeispiel
Calculated ColumnWert pro Zeile, der dauerhaft im Modell gespeichert wirdVollname zusammensetzen aus Vorname + Nachname
MeasureAggregations-Berechnung, die je Visual / Filter neu berechnet wirdUmsatz Year-to-Date, Anzahl offener Incidents
Calculated TableEine komplette neue Tabelle aus DAX-LogikKalendertabelle generieren mit CALENDAR(...)

⚖️ Calculated Columns vs. Measures — der wichtigste Unterschied

AspektCalculated ColumnMeasure
Berechnung erfolgtbeim Datenrefresh, einmal pro Zeilezur Anzeigezeit, je Visual und Filterkontext
Speicherortim Datenmodell (verbraucht RAM)nur die Formel ist gespeichert
Kontextnutzt den Row Contextnutzt den Filter Context
Filter-reaktiv?Nein — Wert ist fixJa — Wert ändert sich mit Slicer/Visual
Typische VerwendungKategorisieren, Klassifizieren, AnreichernKPIs, Aggregationen, dynamische Werte
Performancegut bei statischen Werten, RAM-Lastsehr 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, …)
// Calculated Column - jede Zeile bekommt ihren eigenen Wert
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.

// Measure - Wert haengt vom Filter Context ab
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

OperatorBedeutungBeispiel
+Addition2 + 7
-Subtraktion5 - 3
*Multiplikation2 * 6
/Division4 / 2
^Exponent2 ^ 5

Vergleichsoperatoren

OperatorBedeutungBeispiel
=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

OperatorBedeutungBeispiel
&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

FunktionZweckBeispiel
SUMSumme einer SpalteSUM(Sales[Amount])
AVERAGEMittelwertAVERAGE(Sales[Amount])
COUNTAnzahl numerischer WerteCOUNT(Sales[OrderID])
COUNTROWSAnzahl Zeilen einer TabelleCOUNTROWS(Sales)
DISTINCTCOUNTAnzahl eindeutiger WerteDISTINCTCOUNT(Sales[CustomerID])
MIN / MAXMinimum / MaximumMAX(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.

FunktionZweckBeispiel
SUMXSumme einer berechneten Spalte zur LaufzeitSUMX(Sales, Sales[Quantity] * Sales[Price])
AVERAGEXMittelwert einer berechneten SpalteAVERAGEX(Products, Products[Cost] * 1.2)
COUNTXAnzahl Nicht-LeerwerteCOUNTX(Sales, Sales[Discount])
MAXX / MINXMax/Min einer berechneten SpalteMAXX(Sales, Sales[Quantity] * Sales[Price])
Warning

Vorsicht: Iteratoren sind teurer als reine Aggregationen. Verwende sie nur, wenn der Wert zeilenweise berechnet werden muss. Wenn die Spalte schon im Modell steht, ist SUM schneller als SUMX.

Filter-Funktionen

FunktionZweckBeispiel
CALCULATEFilter Context gezielt verändernCALCULATE(SUM(Sales[Amount]), Sales[Country]="AT")
FILTERTabelle nach Bedingung filternFILTER(Sales, Sales[Amount] > 1000)
ALLalle Filter einer Tabelle/Spalte entfernenCALCULATE(SUM(Sales[Amount]), ALL(Sales))
ALLEXCEPTalle Filter außer den genannten entfernenCALCULATE(SUM(Sales[Amount]), ALLEXCEPT(Sales, Sales[Year]))
REMOVEFILTERSmoderner als ALL für Filter-RemovalCALCULATE(SUM(Sales[Amount]), REMOVEFILTERS(Sales[Country]))

Logik-Funktionen

FunktionZweckBeispiel
IFBedingte BerechnungIF([Umsatz] > 1000, "Hoch", "Niedrig")
SWITCHMehrere Bedingungen, lesbarer als verschachteltes IFSWITCH(TRUE(), [X]>100, "A", [X]>50, "B", "C")
IFERRORFehlerbehandlungIFERROR([Quotient], 0)

Zeit-Intelligenz-Funktionen

FunktionZweckBeispiel
TOTALYTDYear-to-DateTOTALYTD([Umsatz], 'Kalender'[Datum])
SAMEPERIODLASTYEARgleicher Zeitraum letztes JahrCALCULATE([Umsatz], SAMEPERIODLASTYEAR('Kalender'[Datum]))
DATEADDDatum verschiebenDATEADD('Kalender'[Datum], -1, MONTH)
DATESBETWEENDatumsbereichDATESBETWEEN('Kalender'[Datum], DATE(2024,1,1), DATE(2024,12,31))
Information

Voraussetzung für Zeit-Intelligenz: Eine als Datentabelle markierte Kalendertabelle (Mark as date table in Power BI Desktop) — siehe Kalendertabelle.

Beziehungs-Funktionen

FunktionZweckBeispiel
RELATEDWert aus verwandter Tabelle holen (1:N-Richtung)RELATED(Customer[Country]) in Sales
RELATEDTABLEVerwandte Tabelle als Filter-Tabelle (N:1-Richtung)RELATEDTABLE(Sales) in Customer
USERELATIONSHIPInaktive Beziehung aktivierenCALCULATE([Umsatz], USERELATIONSHIP('Kalender'[Datum], Sales[ShipDate]))

💡 Praktische Beispiele

Beispiel 1: Anzahl offener Incidents

Offene Incidents =
CALCULATE(
    COUNTROWS(sdmincident),
    sdmincident[Status] <> "Closed"
)

Use Case: KPI-Karte „Wieviele Tickets sind aktuell offen?"

Beispiel 2: Umsatz Year-over-Year-Vergleich

Umsatz YoY % =
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

Top 10 Kunden Umsatz =
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)

Umsatz-Kategorie =
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).

// Schlecht: Doppelberechnung
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


Verwandte Themen

Kuratiert — kann direkt im Editor ergänzt werden://

Automatisch vorgeschlagen über gemeinsame Tags (powerbi, anleitung): 


Status: Migriert — Team-Review ausstehend · Owner: (festlegen) · Letzter Review: 2026-06-11