Wiki source code of DAX

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

Show last authors
1 {{box cssClass="floatinginfobox" title="**Inhalt**"}}
2 {{toc/}}
3 {{/box}}
4
5 = 📊 DAX =
6
7 == Was ist DAX? ==
8
9 **Data Analysis Expressions** (kurz **DAX**) ist die Formelsprache hinter Power BI und Microsoft Fabric.
10
11 Mit DAX kann man:
12
13 * Berechnete Spalten, Measures und berechnete Tabellen mit intuitiver Syntax dem Datenmodell hinzufĂŒgen
14 * Mit leistungsstarken und flexiblen Funktionen ĂŒber die Möglichkeiten traditioneller Formeln hinaus im relationalen Datenmodell arbeiten
15 * Zeit-Intelligenz-Analysen, dynamische Aggregationen und kontextabhÀngige Berechnungen umsetzen, die in reinem SQL aufwÀndig wÀren
16
17 == đŸ§© Wo wird DAX verwendet? ==
18
19 DAX-Formeln können an drei Stellen im Datenmodell stehen:
20
21 |=Wo|=Wann verwenden|=Beispiel
22 |**Calculated Column**|Wert pro Zeile, der dauerhaft im Modell gespeichert wird|Vollname zusammensetzen aus Vorname + Nachname
23 |**Measure**|Aggregations-Berechnung, die je Visual / Filter neu berechnet wird|Umsatz Year-to-Date, Anzahl offener Incidents
24 |**Calculated Table**|Eine komplette neue Tabelle aus DAX-Logik|Kalendertabelle generieren mit ##CALENDAR(...)##
25
26 == ⚖ Calculated Columns vs. Measures — der wichtigste Unterschied ==
27
28 |=Aspekt|=Calculated Column|=Measure
29 |**Berechnung erfolgt**|beim Datenrefresh, einmal pro Zeile|zur Anzeigezeit, je Visual und Filterkontext
30 |**Speicherort**|im Datenmodell (verbraucht RAM)|nur die Formel ist gespeichert
31 |**Kontext**|nutzt den **Row Context**|nutzt den **Filter Context**
32 |**Filter-reaktiv?**|Nein — Wert ist fix|Ja — Wert Ă€ndert sich mit Slicer/Visual
33 |**Typische Verwendung**|Kategorisieren, Klassifizieren, Anreichern|KPIs, Aggregationen, dynamische Werte
34 |**Performance**|gut bei statischen Werten, RAM-Last|sehr effizient, kein Speicher-Overhead
35
36 **Faustregel:** Im Zweifel ein Measure. Eine Calculated Column nur dann, wenn der Wert pro Zeile fest sein muss und nicht von Filtern abhÀngt.
37
38 == 🎯 Row Context vs. Filter Context ==
39
40 Die zwei zentralen DAX-Konzepte. Wer diese versteht, beherrscht 80 % aller DAX-Schwierigkeiten.
41
42 === Row Context ===
43
44 Der **Row Context** ist „die aktuelle Zeile". Existiert automatisch in:
45
46 * Calculated Columns (ĂŒber jede Zeile der Tabelle)
47 * Iterator-Funktionen mit X-Suffix (##SUMX##, ##AVERAGEX##, ##FILTER##, 
)
48
49 {{code language="dax"}}
50 // Calculated Column - jede Zeile bekommt ihren eigenen Wert
51 Vollname = [Vorname] & " " & [Nachname]
52 {{/code}}
53
54 === Filter Context ===
55
56 Der **Filter Context** ist „die aktuelle Filter-Situation" — definiert durch Slicer, Page-Filter, Zeilen-/Spalten-Beschriftungen in Matrixen, Visual-Filter. Existiert in Measures.
57
58 {{code language="dax"}}
59 // Measure - Wert haengt vom Filter Context ab
60 Umsatz = SUM(Sales[Amount])
61 // Wenn Filter "Quartal = Q1" gesetzt: nur Q1-Zeilen summieren
62 {{/code}}
63
64 Mit ##CALCULATE## kann man den Filter Context **gezielt verĂ€ndern** — das ist die mĂ€chtigste DAX-Funktion ĂŒberhaupt.
65
66 == 🔱 DAX-Operatoren ==
67
68 === Arithmetische Operatoren ===
69
70 |=**Operator**|=**Bedeutung**|=**Beispiel**
71 |##+##|Addition|##2 + 7##
72 |##-##|Subtraktion|##5 - 3##
73 |##*##|Multiplikation|##2 * 6##
74 |##/##|Division|##4 / 2##
75 |##^##|Exponent|##2 ^ 5##
76
77 === Vergleichsoperatoren ===
78
79 |=**Operator**|=**Bedeutung**|=**Beispiel**
80 |##=##|ist gleich|##[City] = "Wien"##
81 |##>##|grĂ¶ĂŸer als|##[Quantity] > 10##
82 |##<##|kleiner als|##[Quantity] < 10##
83 |##>=##|grĂ¶ĂŸer als oder gleich|##[Unit_Price] >= 2.5##
84 |##<=##|kleiner als oder gleich|##[Unit_Price] <= 2.5##
85 |##<>##|nicht gleich|##[Country] <> "Deutschland"##
86
87 === Text- und logische Operatoren ===
88
89 |=**Operator**|=**Bedeutung**|=**Beispiel**
90 |##&##|verkettet zwei Stringwerte zu einem String|##[City] & " " & [State]##
91 |##&&##|"Und"-VerknĂŒpfung zwischen zwei logischen AusdrĂŒcken|##([State]="MA") && ([Quantity]>10)##
92 |##~|~|##|"Oder"-VerknĂŒpfung zwischen zwei logischen AusdrĂŒcken|##([State]="MA") ~|~| ([Quantity]>10)##
93 |##IN##|"Oder"-VerknĂŒpfung basierend auf einer Liste|##'Store Lookup'[State] IN {"MA", "CT", "NY"}##
94
95 == 🧼 Wichtige DAX-Funktionen nach Kategorie ==
96
97 === Aggregations-Funktionen ===
98
99 |=**Funktion**|=**Zweck**|=**Beispiel**
100 |##SUM##|Summe einer Spalte|##SUM(Sales[Amount])##
101 |##AVERAGE##|Mittelwert|##AVERAGE(Sales[Amount])##
102 |##COUNT##|Anzahl numerischer Werte|##COUNT(Sales[OrderID])##
103 |##COUNTROWS##|Anzahl Zeilen einer Tabelle|##COUNTROWS(Sales)##
104 |##DISTINCTCOUNT##|Anzahl eindeutiger Werte|##DISTINCTCOUNT(Sales[CustomerID])##
105 |##MIN## / ##MAX##|Minimum / Maximum|##MAX(Sales[Date])##
106
107 === Iterator-Funktionen (X-Suffix) ===
108
109 Iteratoren berechnen pro Zeile (Row Context) und aggregieren am Ende. Hilfreich bei Werten, die zeilenweise berechnet werden mĂŒssen.
110
111 |=**Funktion**|=**Zweck**|=**Beispiel**
112 |##SUMX##|Summe einer berechneten Spalte zur Laufzeit|##SUMX(Sales, Sales[Quantity] * Sales[Price])##
113 |##AVERAGEX##|Mittelwert einer berechneten Spalte|##AVERAGEX(Products, Products[Cost] * 1.2)##
114 |##COUNTX##|Anzahl Nicht-Leerwerte|##COUNTX(Sales, Sales[Discount])##
115 |##MAXX## / ##MINX##|Max/Min einer berechneten Spalte|##MAXX(Sales, Sales[Quantity] * Sales[Price])##
116
117 {{warning}}
118 **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##.
119 {{/warning}}
120
121 === Filter-Funktionen ===
122
123 |=**Funktion**|=**Zweck**|=**Beispiel**
124 |##CALCULATE##|Filter Context gezielt verÀndern|##CALCULATE(SUM(Sales[Amount]), Sales[Country]="AT")##
125 |##FILTER##|Tabelle nach Bedingung filtern|##FILTER(Sales, Sales[Amount] > 1000)##
126 |##ALL##|alle Filter einer Tabelle/Spalte entfernen|##CALCULATE(SUM(Sales[Amount]), ALL(Sales))##
127 |##ALLEXCEPT##|alle Filter außer den genannten entfernen|##CALCULATE(SUM(Sales[Amount]), ALLEXCEPT(Sales, Sales[Year]))##
128 |##REMOVEFILTERS##|moderner als ##ALL## fĂŒr Filter-Removal|##CALCULATE(SUM(Sales[Amount]), REMOVEFILTERS(Sales[Country]))##
129
130 === Logik-Funktionen ===
131
132 |=**Funktion**|=**Zweck**|=**Beispiel**
133 |##IF##|Bedingte Berechnung|##IF([Umsatz] > 1000, "Hoch", "Niedrig")##
134 |##SWITCH##|Mehrere Bedingungen, lesbarer als verschachteltes IF|##SWITCH(TRUE(), [X]>100, "A", [X]>50, "B", "C")##
135 |##IFERROR##|Fehlerbehandlung|##IFERROR([Quotient], 0)##
136
137 === Zeit-Intelligenz-Funktionen ===
138
139 |=**Funktion**|=**Zweck**|=**Beispiel**
140 |##TOTALYTD##|Year-to-Date|##TOTALYTD([Umsatz], 'Kalender'[Datum])##
141 |##SAMEPERIODLASTYEAR##|gleicher Zeitraum letztes Jahr|##CALCULATE([Umsatz], SAMEPERIODLASTYEAR('Kalender'[Datum]))##
142 |##DATEADD##|Datum verschieben|##DATEADD('Kalender'[Datum], -1, MONTH)##
143 |##DATESBETWEEN##|Datumsbereich|##DATESBETWEEN('Kalender'[Datum], DATE(2024,1,1), DATE(2024,12,31))##
144
145 {{info}}
146 **Voraussetzung fĂŒr Zeit-Intelligenz:** Eine als **Datentabelle markierte** Kalendertabelle (##Mark as date table## in Power BI Desktop) — siehe [[Kalendertabelle>>doc:IT-Wiki.02-Tools.PowerBI.Kalendertabelle.WebHome]].
147 {{/info}}
148
149 === Beziehungs-Funktionen ===
150
151 |=**Funktion**|=**Zweck**|=**Beispiel**
152 |##RELATED##|Wert aus verwandter Tabelle holen (1:N-Richtung)|##RELATED(Customer[Country])## in Sales
153 |##RELATEDTABLE##|Verwandte Tabelle als Filter-Tabelle (N:1-Richtung)|##RELATEDTABLE(Sales)## in Customer
154 |##USERELATIONSHIP##|Inaktive Beziehung aktivieren|##CALCULATE([Umsatz], USERELATIONSHIP('Kalender'[Datum], Sales[ShipDate]))##
155
156 == 💡 Praktische Beispiele ==
157
158 === Beispiel 1: Anzahl offener Incidents ===
159
160 {{code language="dax"}}
161 Offene Incidents =
162 CALCULATE(
163 COUNTROWS(sdmincident),
164 sdmincident[Status] <> "Closed"
165 )
166 {{/code}}
167
168 Use Case: KPI-Karte „Wieviele Tickets sind aktuell offen?"
169
170 === Beispiel 2: Umsatz Year-over-Year-Vergleich ===
171
172 {{code language="dax"}}
173 Umsatz YoY % =
174 VAR UmsatzAktuell = [Umsatz]
175 VAR UmsatzVorjahr = CALCULATE([Umsatz], SAMEPERIODLASTYEAR('Kalender'[Datum]))
176 RETURN
177 DIVIDE(UmsatzAktuell - UmsatzVorjahr, UmsatzVorjahr)
178 {{/code}}
179
180 Use Case: Spalte „Wachstum ggĂŒ. Vorjahr" in einem Trendvisual.
181
182 === Beispiel 3: Top-N-Logik ===
183
184 {{code language="dax"}}
185 Top 10 Kunden Umsatz =
186 CALCULATE(
187 [Umsatz],
188 TOPN(10, ALL(Customer), [Umsatz], DESC)
189 )
190 {{/code}}
191
192 Use Case: „Welcher Anteil des Gesamtumsatzes entfĂ€llt auf die zehn grĂ¶ĂŸten Kunden?"
193
194 === Beispiel 4: Bedingte Klassifizierung (Calculated Column) ===
195
196 {{code language="dax"}}
197 Umsatz-Kategorie =
198 SWITCH(TRUE(),
199 Sales[Amount] >= 10000, "Gross",
200 Sales[Amount] >= 1000, "Mittel",
201 Sales[Amount] >= 100, "Klein",
202 "Mikro"
203 )
204 {{/code}}
205
206 Use Case: Sales-Zeilen klassifizieren, um sie in Slicern und Gruppierungen zu nutzen.
207
208 == 📐 Best Practices ==
209
210 === Variablen verwenden ===
211
212 Variablen mit ##VAR ... RETURN## machen DAX-Code lesbarer und schneller (Wert wird nur einmal berechnet).
213
214 {{code language="dax"}}
215 // Schlecht: Doppelberechnung
216 Gewinn-Marge = ([Umsatz] - [Kosten]) / [Umsatz]
217
218 // Besser: Variable
219 Gewinn-Marge =
220 VAR Umsatz = [Umsatz]
221 VAR Gewinn = Umsatz - [Kosten]
222 RETURN
223 DIVIDE(Gewinn, Umsatz)
224 {{/code}}
225
226 === DIVIDE statt / ===
227
228 ##DIVIDE(A, B)## behandelt Division durch 0 sicher (gibt ##BLANK## zurĂŒck). Der Operator ##/## wirft Fehler.
229
230 === Sprechende Measure-Namen ===
231
232 Measure-Namen klar und durchgĂ€ngig benennen — „Umsatz YTD", „Anzahl offener Incidents", nicht „Measure 1".
233
234 === CALCULATE als zentrales Werkzeug ===
235
236 90 % aller nicht-trivialen Measures nutzen ##CALCULATE##. Wer ##CALCULATE## beherrscht, beherrscht DAX.
237
238 === Iteratoren sparsam ===
239
240 Wenn die Spalte schon im Modell steht: ##SUM##, nicht ##SUMX##. Iteratoren erst, wenn der Wert zeilenweise neu berechnet werden muss.
241
242 == 🔗 Vertiefung ==
243
244 * [[Measures>>doc:IT-Wiki.02-Tools.PowerBI.Measures.WebHome]] — Details zu Measures
245 * [[Datenmodell>>doc:IT-Wiki.02-Tools.PowerBI.Datenmodell.WebHome]] — Beziehungen verstehen
246 * [[Kalendertabelle>>doc:IT-Wiki.02-Tools.PowerBI.Kalendertabelle.WebHome]] — Zeit-Intelligenz aktivieren
247 * [[NĂŒtzliche Ressourcen>>doc:IT-Wiki.02-Tools.PowerBI.Nuetzliche-Ressourcen.WebHome]] — BĂŒcher, Kurse, DAX-Patterns-Website
248
249 ----
250
251 == Verwandte Themen ==
252
253 //Kuratiert — kann direkt im Editor ergĂ€nzt werden://
254
255 * [[Aktualisierung von Queries>>doc:IT-Wiki.02-Tools.PowerBI.Aktualisierung-von-Queries.WebHome]]
256 * [[Bedingte Spalten (Conditional Columns)>>doc:IT-Wiki.02-Tools.PowerBI.Bedingte-Spalten-(Conditional-Columns).WebHome]]
257 * [[Berechnete Spalten (Calculated Columns)>>doc:IT-Wiki.02-Tools.PowerBI.Berechnete-Spalten-(Calculated-Columns).WebHome]]
258
259 {{include reference="IT-Wiki.Makros.Verwandte-Themen.WebHome"/}}
260
261 ----
262 **Status:** Migriert — Team-Review ausstehend · **Owner:** //(festlegen)// · **Letzter Review:** 2026-06-11