Wiki source code of DAX
Version 2.1 by Dimitri Rupp on 2026/06/11 09:15
Hide last authors
| author | version | line-number | content |
|---|---|---|---|
![]() |
1.1 | 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 | {{info}} | ||
| 252 | **Migrations-Hinweis:** Diese Seite wurde am 24.05.2026 aus dem SharePoint WikiPowerBI ins Lumi-XWiki-Staging migriert. | ||
| 253 | |||
| 254 | **Original-Autor:** Wilfing Vanessa (Commercial Trainee, Erstellung und Ănderung 2023-12-19) | ||
| 255 | **Original-Quelle:** [[DAX (SharePoint)>>url:https://spltele.sharepoint.com/sites/WikiPowerBI/SitePages/DAX.aspx]] | ||
| 256 | **Migration:** Dimitri Rupp via ClaudeAI | ||
| 257 | |||
| 258 | **Bemerkungen zur Migration:** | ||
| 259 | * **Wissensdatenbank-Ausbau** im Rahmen des Strategie-Wechsels âKnowledge-Base-QualitĂ€t": ursprĂŒngliche Operator-Tabellen 1:1 erhalten, Erweiterungen aus allgemeinem BI-Wissen | ||
| 260 | * **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 | ||
| 261 | * Sprach-PrĂ€zisierung der Operator-Beschreibungen unverĂ€ndert ĂŒbernommen | ||
| 262 | * Beispiele sind strukturelle Templates â keine SPL-internen Daten verwendet | ||
| 263 | {{/info}} | ||
| 264 | |||
| 265 | |||
| 266 | ---- | ||
| 267 | |||
| 268 | == Verwandte Themen == | ||
| 269 | |||
| 270 | //Kuratiert â kann direkt im Editor ergĂ€nzt werden:// | ||
| 271 | |||
| 272 | * [[Aktualisierung von Queries>>doc:IT-Wiki.02-Tools.PowerBI.Aktualisierung-von-Queries.WebHome]] | ||
| 273 | * [[Bedingte Spalten (Conditional Columns)>>doc:IT-Wiki.02-Tools.PowerBI.Bedingte-Spalten-(Conditional-Columns).WebHome]] | ||
| 274 | * [[Berechnete Spalten (Calculated Columns)>>doc:IT-Wiki.02-Tools.PowerBI.Berechnete-Spalten-(Calculated-Columns).WebHome]] | ||
| 275 | |||
| 276 | {{include reference="IT-Wiki.Makros.Verwandte-Themen.WebHome"/}} | ||
| 277 | |||
| 278 | ---- | ||
| 279 | **Status:** Migriert â Team-Review ausstehend · **Owner:** //(festlegen)// · **Letzter Review:** 2026-06-11 | ||
| 280 |
