DAX

Version 2.1 by Dimitri Rupp on 2026/06/11 09:15
Warning
For security reasons, the document is displayed in restricted mode as it is not the current version. There may be differences and errors due to this.

📊 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


Information

Migrations-Hinweis: Diese Seite wurde am 24.05.2026 aus dem SharePoint WikiPowerBI ins Lumi-XWiki-Staging migriert.

Original-Autor: Wilfing Vanessa (Commercial Trainee, Erstellung und Änderung 2023-12-19)
Original-Quelle: DAX (SharePoint)
Migration: Dimitri Rupp via ClaudeAI

Bemerkungen zur Migration:

  • Wissensdatenbank-Ausbau im Rahmen des Strategie-Wechsels „Knowledge-Base-Qualität": ursprüngliche Operator-Tabellen 1:1 erhalten, Erweiterungen aus allgemeinem BI-Wissen
  • NEU: Calculated-Columns-vs.-Measures-Vergleichstabelle, Row-Context-vs.-Filter-Context-Konzept, vier Funktionskategorien (Aggregation / Iteratoren / Filter / Logik / Zeit-Intelligenz / Beziehungen), vier praktische Beispiele (offene Incidents, YoY, Top-N, Klassifizierung), fünf Best Practices, Cross-Links zu verwandten Pages
  • Sprach-Präzisierung der Operator-Beschreibungen unverändert übernommen
  • Beispiele sind strukturelle Templates — keine SPL-internen Daten verwendet

Verwandte Themen

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

Failed to execute the [velocity] macro. Cause: [The execution of the [velocity] script macro is not allowed in [xwiki:IT-Wiki.Makros.Verwandte-Themen.WebHome]. Check the rights of its last author or the parameters if it's rendered from another script.]. Click on this message for details.


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