Willkommen in der Welt von DAX! Wenn Sie mit Tools wie Power BI, Power Pivot für Excel oder SQL Server Analysis Services (SSAS) arbeiten, ist Ihnen diese Abkürzung sicherlich schon begegnet. DAX, oder Data Analysis Expressions, ist die Formelsprache, die diesen leistungsstarken Werkzeugen ihre analytische Superkraft verleiht. Doch für viele Anwender, die täglich damit zu tun haben, fühlt sich DAX oft wie eine geheimnisvolle Blackbox an. Man weiß, dass man damit beeindruckende Berechnungen durchführen kann, aber der Weg dorthin scheint steinig und voller unverständlicher Syntax. Kommt Ihnen das bekannt vor? Sie erstellen vielleicht einfache Summen, aber sobald die Anforderungen komplexer werden – zum Beispiel bei der Berechnung von prozentualen Anteilen oder Vorjahresvergleichen – stoßen Sie an Ihre Grenzen. Dieser Artikel ist genau für Sie geschrieben. Wir werden gemeinsam die Tür zu DAX aufstoßen, und zwar nicht mit trockener Theorie, sondern mit praxisnahen Formeln und Konzepten, die Ihnen sofort im Arbeitsalltag weiterhelfen. Betrachten Sie dies als Ihren persönlichen DAX-Workshop, der Ihnen die Bausteine an die Hand gibt, um aus Ihren Daten echte Erkenntnisse zu gewinnen.
TL;DR – DAX leicht gemacht: Die wichtigsten Grundlagen
- Kontext verstehen: Zeilen- vs. Filterkontext – das Fundament von DAX
- CALCULATE beherrschen: Die wichtigste Funktion zur Kontextmanipulation
- Sichere Formeln: DIVIDE statt Division, explizite Measures verwenden
- Time Intelligence: TOTALYTD und SAMEPERIODLASTYEAR für Zeitvergleiche
- Iteratoren nutzen: SUMX für zeilenweise Berechnungen ohne berechnete Spalten
⏱️ Lesezeit: 12 Minuten 💡 Level: Anfänger bis Fortgeschritten
Das Fundament: Warum DAX anders denkt
Bevor wir uns in die Formeln stürzen, müssen wir einen entscheidenden Punkt verstehen: DAX ist keine klassische Programmiersprache und es ist auch nicht einfach nur eine Erweiterung von Excel-Formeln. Die größte Hürde für viele Einsteiger ist das Konzept des Kontexts. Wenn Sie dieses Prinzip einmal verinnerlicht haben, wird Ihnen der Rest viel leichter fallen.
Der Evaluationskontext: Das „Wo“ und „Wie“ jeder Berechnung
Jede DAX-Formel wird in einem bestimmten Kontext ausgewertet. Man unterscheidet hauptsächlich zwischen zwei Arten:
- Zeilenkontext (Row Context): Stellen Sie sich vor, Sie fügen in Ihrer Datentabelle eine neue Spalte hinzu, eine sogenannte „Calculated Column“. Wenn Sie hier eine Formel eingeben, wie z.B.
= [Umsatz] - [Kosten], dann wird diese Berechnung für jede einzelne Zeile der Tabelle durchgeführt. DAX geht Zeile für Zeile durch und hat dabei immer nur die Werte der aktuellen Zeile „im Blick“. Das ist der Zeilenkontext. Er antwortet auf die Frage: „Was soll ich in DIESER Zeile tun?“ - Filterkontext (Filter Context): Dies ist der mächtigste und oft am schwierigsten zu verstehende Teil von DAX. Der Filterkontext beschreibt die Menge der Daten, die für eine Berechnung herangezogen werden. Wenn Sie in einem Power BI-Bericht auf ein bestimmtes Jahr in einem Slicer klicken oder einen Balken in einem Diagramm auswählen, ändern Sie den Filterkontext. Alle Ihre Berechnungen (die sogenannten „Measures“) werden dann nur noch auf Basis dieser gefilterten Daten durchgeführt. Ein Measure wie
SUM('Umsatztabelle'[Umsatz])summiert also nicht immer den Gesamtumsatz, sondern den Umsatz, der dem aktuellen Filterkontext entspricht (z.B. der Umsatz für das ausgewählte Jahr und die ausgewählte Produktkategorie).
Der Schlüssel zum DAX-Erfolg liegt darin, zu verstehen, welcher Kontext gerade aktiv ist und wie man ihn gezielt manipulieren kann. Genau hier kommt die wichtigste Funktion in DAX ins Spiel: CALCULATE.
Die Königin der DAX-Funktionen: CALCULATE
Wenn Sie nur eine einzige DAX-Funktion wirklich meisterhaft beherrschen wollen, dann ist es CALCULATE. Sie ist das Schweizer Taschenmesser für jede Datenanalyse. CALCULATE ermöglicht es Ihnen, den Filterkontext einer Berechnung gezielt zu verändern. Die grundlegende Syntax lautet:
CALCULATE(<Ausdruck>, <Filter1>, <Filter2>, ...)
Stellen Sie sich vor, Sie haben ein einfaches Measure für den Gesamtumsatz:
Gesamtumsatz = SUM('Verkaufsdaten'[Umsatz])
Nun möchten Sie den Umsatz nur für ein bestimmtes Produkt, sagen wir „Fahrräder“, berechnen. Mit CALCULATE ist das ein Kinderspiel:
Fahrrad_Umsatz = CALCULATE([Gesamtumsatz], 'Produkttabelle'[Kategorie] = "Fahrräder")
Was passiert hier? CALCULATE nimmt unser bestehendes Measure [Gesamtumsatz] und wendet einen neuen Filter an, bevor es die Berechnung durchführt. Es ignoriert dabei jeden anderen Filter, der eventuell auf der Spalte ‚Produkttabelle'[Kategorie] liegt und setzt stattdessen den Filter „Fahrräder“. Für alle anderen Filter (z.B. auf Jahr oder Region) bleibt der ursprüngliche Filterkontext erhalten. Diese Fähigkeit, den Kontext zu manipulieren, ist die Grundlage für fast alle fortgeschrittenen Analysen.
🔗 Tipp: Vertiefen Sie Ihr Wissen mit unseren verborgenen Power BI Funktionen und erweiterten DAX-Techniken.
Praxisnahe Formeln für den Arbeitsalltag
Genug der Theorie! Lassen Sie uns nun einige konkrete Beispiele ansehen, die typische Herausforderungen im Berufsalltag lösen. Wir bauen dabei schrittweise aufeinander auf.
Aggregationsfunktionen: Das tägliche Brot
Diese Funktionen sind die einfachsten und bilden die Basis für fast alles Weitere. Sie fassen die Werte einer Spalte zusammen.
- SUM: Summiert alle Zahlen in einer Spalte.
SUM('Verkaufsdaten'[Umsatz]) - AVERAGE: Berechnet den Durchschnitt.
AVERAGE('Verkaufsdaten'[Umsatz]) - COUNT: Zählt die Anzahl der Zeilen in einer Spalte, die Zahlen enthalten.
COUNT('Verkaufsdaten'[Bestellnummer]) - DISTINCTCOUNT: Zählt die Anzahl der eindeutigen Werte in einer Spalte. Das ist extrem nützlich, um zum Beispiel die Anzahl aktiver Kunden zu ermitteln.
DISTINCTCOUNT('Verkaufsdaten'[Kundennummer]) - MIN / MAX: Findet den kleinsten bzw. größten Wert.
MAX('Verkaufsdaten'[Umsatz])
Praxis-Tipp: Erstellen Sie für jede dieser grundlegenden Berechnungen ein sogenanntes explizites Measure. Anstatt in Power BI einfach das Feld „Umsatz“ in ein Diagramm zu ziehen und die Aggregation auf „Summe“ zu stellen (implizites Measure), definieren Sie es fest: Gesamtumsatz = SUM('Verkaufsdaten'[Umsatz]). Das macht Ihre Modelle wartbarer, wiederverwendbar und ist die Grundlage für komplexere Berechnungen.
Logische Funktionen: Wenn, dann, sonst…
Oft müssen wir Berechnungen durchführen, die von bestimmten Bedingungen abhängen. Hier kommen logische Funktionen ins Spiel.
Die IF-Funktion: Der Klassiker
Die IF-Funktion funktioniert ganz ähnlich wie in Excel. Sie prüft eine Bedingung und gibt je nach Ergebnis einen von zwei Werten zurück.
IF(<Bedingung>, <Wert_wenn_wahr>, <Wert_wenn_falsch>)
Nehmen wir an, wir wollen eine Preiskategorie erstellen. In einer berechneten Spalte der Produkttabelle könnten wir schreiben:
Preiskategorie = IF('Produkttabelle'[Preis] > 1000, "Hochpreisig", "Standard")
DIVIDE: Sicheres Teilen ohne Fehler
Eine häufige Aufgabe ist die Berechnung von Anteilen oder Durchschnittspreisen, was eine Division erfordert. Was passiert aber, wenn der Nenner Null ist? Richtig, es gibt einen Fehler. Die DIVIDE-Funktion fängt dieses Problem elegant ab.
Statt = [Gewinn] / [Umsatz], was bei einem Umsatz von Null einen Fehler erzeugt, schreiben wir:
Gewinnmarge = DIVIDE([Gewinn], [Umsatz], 0)
Der dritte, optionale Parameter gibt an, welcher Wert zurückgegeben werden soll, falls eine Division durch Null auftritt. Hier geben wir einfach 0 zurück. Das macht Ihre Berichte robuster.
Kontextmanipulation für Fortgeschrittene
Jetzt kombinieren wir unser Wissen über CALCULATE mit weiteren Funktionen, um noch spannendere Analysen durchzuführen.
Der prozentuale Anteil am Gesamten
Eine sehr häufige Anforderung: Wie hoch ist der prozentuale Anteil des Umsatzes einer bestimmten Produktkategorie am Gesamtumsatz? Hierfür müssen wir in der Lage sein, den Filter auf die Produktkategorie für den Nenner unserer Division zu ignorieren.
Hier kommt die ALL-Funktion ins Spiel. ALL entfernt Filter von einer Tabelle oder von Spalten.
Das Measure für den prozentualen Anteil sieht so aus:
Umsatzanteil % = DIVIDE ( [Gesamtumsatz], CALCULATE( [Gesamtumsatz], ALL('Produkttabelle') ) )
Analysieren wir das Schritt für Schritt:
- Der Zähler
[Gesamtumsatz]berechnet den Umsatz im aktuellen Filterkontext (z.B. für die eine Produktkategorie in einer Tabellenzeile). - Der Nenner ist der entscheidende Teil.
CALCULATE([Gesamtumsatz], ALL('Produkttabelle'))berechnet den Gesamtumsatz, aber dieALL-Funktion sorgt dafür, dass alle Filter von der ‚Produkttabelle‘ entfernt werden. Das Ergebnis ist also immer der absolute Gesamtumsatz über alle Produkte. DIVIDEteilt den Umsatz der Kategorie durch den Gesamtumsatz und voilà – wir haben den prozentualen Anteil.
Iteratoren: Zeile für Zeile rechnen mit X-Funktionen
Erinnern Sie sich an den Zeilenkontext? Manchmal müssen wir Berechnungen durchführen, die eine Aggregation einer zeilenweisen Berechnung sind. Ein klassisches Beispiel ist die Berechnung des Gesamtumsatzes, wenn wir nur Menge und Einzelpreis in unserer Tabelle haben.
Man könnte versucht sein, eine berechnete Spalte [Zeilenumsatz] = [Menge] * [Preis] zu erstellen und dann ein Measure SUM([Zeilenumsatz]) zu verwenden. Das funktioniert, bläht aber Ihr Datenmodell unnötig auf, da das Ergebnis für jede Zeile gespeichert wird.
Hier kommen die Iteratoren-Funktionen wie SUMX, AVERAGEX oder COUNTX ins Spiel. Diese Funktionen gehen eine Tabelle Zeile für Zeile durch, führen eine Berechnung durch und aggregieren am Ende die Ergebnisse, ohne etwas physisch im Modell zu speichern.
Die bessere Lösung für unser Umsatzproblem ist also ein einziges Measure:
Gesamtumsatz (mit SUMX) = SUMX('Verkaufsdaten', 'Verkaufsdaten'[Menge] * 'Verkaufsdaten'[Preis])
SUMX nimmt als erstes Argument die Tabelle, die es durchlaufen soll (‚Verkaufsdaten‘), und als zweites Argument den Ausdruck, der für jede Zeile dieser Tabelle berechnet werden soll. Das ist nicht nur performanter, sondern auch eleganter.
⚡ Performance-Tipp: Optimieren Sie Ihre Datenaufbereitung mit unseren Power Query Profitechniken bevor Sie komplexe DAX-Formeln schreiben.
Time Intelligence: Die Zeit im Griff
Keine Analyse ist komplett ohne den Vergleich über die Zeit. DAX bietet eine ganze Reihe von leistungsstarken Time-Intelligence-Funktionen. Die absolute Voraussetzung dafür ist eine gut strukturierte Datumstabelle in Ihrem Modell. Diese Tabelle sollte eine durchgehende Datumsreihe ohne Lücken enthalten und als „Date Table“ im Modell markiert sein.
Year-to-Date (YTD) Berechnungen
Wie hoch ist der Umsatz seit Beginn des Jahres bis zum heutigen Tag (bzw. bis zum letzten Datum im aktuellen Filterkontext)?
Umsatz YTD = TOTALYTD([Gesamtumsatz], 'Datumstabelle'[Datum])
Diese einfache Formel erledigt die ganze Magie für Sie. Sie nimmt Ihr Umsatz-Measure und Ihre Datumsspalte und berechnet den kumulierten Wert für das jeweilige Jahr.
Vergleich mit dem Vorjahr
Eine der wichtigsten Kennzahlen überhaupt: Wie schneiden wir im Vergleich zum Vorjahreszeitraum ab? Hierfür gibt es die Funktion SAMEPERIODLASTYEAR.
Umsatz Vorjahr = CALCULATE([Gesamtumsatz], SAMEPERIODLASTYEAR('Datumstabelle'[Datum]))
Auch hier sehen wir wieder unsere Königin CALCULATE. Sie nimmt den Gesamtumsatz und modifiziert den Filterkontext, indem sie ihn genau um ein Jahr in die Vergangenheit verschiebt. Jetzt können Sie ganz einfach die Wachstumsrate berechnen:
Wachstum vs. VJ % = DIVIDE( ([Gesamtumsatz] - [Umsatz Vorjahr]), [Umsatz Vorjahr] )
💡 Excel-Nutzer aufgepasst: Bevor Sie in DAX einsteigen, sollten Sie wissen, wie KI Ihre Excel-Arbeit bereits heute revolutionieren kann. Entdecken Sie die 10 besten Copilot-Prompts für Excel, um Formeln, Pivot-Tabellen und Datenanalysen in Sekunden zu automatisieren – der perfekte Einstieg in die KI-gestützte Datenarbeit.
Fazit: Übung macht den Meister
Wir haben nun an der Oberfläche der Möglichkeiten von DAX gekratzt. Von den grundlegenden Konzepten des Zeilen- und Filterkontexts über die zentrale Bedeutung von CALCULATE bis hin zu praktischen Anwendungsfällen wie prozentualen Anteilen, Iteratoren mit SUMX und zeitbasierten Analysen mit Time-Intelligence-Funktionen. Der Schlüssel zum Erfolg mit DAX ist nicht, hunderte von Funktionen auswendig zu lernen. Es geht darum, die grundlegenden Mechanismen, insbesondere den Evaluationskontext, zu verstehen. Wenn Sie verinnerlicht haben, wie DAX „denkt“ und wie Sie mit Funktionen wie CALCULATE und ALL den Kontext gezielt steuern können, erschließt sich Ihnen eine völlig neue Welt der Datenanalyse. Beginnen Sie mit den hier gezeigten Formeln. Bauen Sie sie in Ihren eigenen Berichten nach, experimentieren Sie damit und versuchen Sie, sie an Ihre spezifischen Fragestellungen anzupassen. Jeder Fehler ist eine Lernchance. Geben Sie nicht auf, wenn eine Formel nicht auf Anhieb funktioniert. Nutzen Sie Variablen (VAR), um komplexe Formeln zu strukturieren und zu debuggen. Mit jeder erfolgreich gelösten Herausforderung wird Ihre Sicherheit wachsen und DAX wird vom gefürchteten Gegner zum wertvollsten Verbündeten in Ihrer täglichen Arbeit mit Daten. Viel Erfolg!
📊 Weiterführend: Setzen Sie Ihre DAX-Kenntnisse in fortgeschrittenen Visualisierungstechniken praktisch um.
Ihre DAX-Praxis ist gefragt!
Welche der vorgestellten Formeln hat bei Ihnen den größten „Aha“-Effekt ausgelöst? Vor welcher Herausforderung stehen Sie aktuell bei Ihren DAX-Analysen oder haben Sie einen eigenen Trick, um den Filterkontext zu meistern? Teilen Sie Ihre Erfahrungen und Fragen in den Kommentaren – ich freue mich auf den Austausch und antworte gerne!
Für weitere DAX-Tipps und praxisnahe Einblicke folgen Sie mir auch auf LinkedIn, wo ich regelmäßig neue Lösungsansätze teile.