Teil unserer Data Analytics & BI-Serie
Den vollständigen Leitfaden lesenDAX-Formeln, die jeder Geschäftsanwender kennen sollte
DAX (Data Analysis Expressions) ist die Formelsprache, die Power BI von einem einfachen Diagrammtool in eine vollwertige Analyse-Engine verwandelt. Während die Drag-and-Drop-Schnittstelle von Power BI grundlegende Aggregationen übernimmt, erfordert echte Business Intelligence DAX. Jahresvergleiche, gleitende Durchschnittswerte, Rankings, Was-wäre-wenn-Szenarien und komplexe KPIs hängen alle von DAX-Formeln ab.
Die Herausforderung besteht darin, dass DAX täuschend einfach aussieht, sich aber auf eine Weise verhält, die selbst erfahrene Excel-Benutzer überrascht. Die Konzepte Filterkontext, Zeilenkontext und Kontextübergang gelten nur für DAX und haben keine direkte Entsprechung in Excel oder SQL. Dieser Leitfaden konzentriert sich auf die 20 praktischsten DAX-Formeln für Geschäftsanwender, mit Beispielen aus der Praxis, die Sie sofort anpassen können.
Wichtige Erkenntnisse
- CALCULATE ist die wichtigste DAX-Funktion – sie ändert den Filterkontext und wird in über 80 Prozent der nicht trivialen Kennzahlen verwendet
- Zeitintelligenzfunktionen (TOTALYTD, SAMEPERIODLASTYEAR, DATEADD) erfordern eine ordnungsgemäße Datumstabelle, die im Modell als solche gekennzeichnet ist
- Die VAR/RETURN-Syntax macht komplexe Kennzahlen lesbar und vermeidet redundante Berechnungen
- Iteratorfunktionen (SUMX, AVERAGEX, RANKX) werten Ausdrücke Zeile für Zeile aus, während Aggregatoren (SUM, AVERAGE) mit Spalten arbeiten – Der Kontextübergang erfolgt, wenn eine berechnete Spalte oder ein Iterator eine Kennzahl aufruft und den Zeilenkontext in einen Filterkontext umwandelt
- SWITCH(TRUE(), ...) ersetzt verschachtelte IF-Anweisungen und ist weitaus besser lesbar
- ALL, ALLEXCEPT und REMOVEFILTERS steuern, welche Filter aktiv sind – seien Sie jedoch vorsichtig mit RLS-Auswirkungen
Foundation: Filterkontext und Zeilenkontext
Bevor Sie sich mit Formeln befassen, ist es wichtig, diese beiden Konzepte zu verstehen. Jede Verwirrung in DAX geht auf den Filterkontext und den Zeilenkontext zurück.
Kontext filtern
Der Filterkontext ist der Satz von Filtern, die auf eine Berechnung angewendet werden. Es kommt von Slicern, visuellen Filtern, Seitenfiltern, Berichtsfiltern und RLS. Wenn Sie eine Kennzahl in einer visuellen Matrix mit „Jahr“ in Zeilen und „Region“ in Spalten platzieren, verfügt jede Zelle über einen eindeutigen Filterkontext: (Jahr = 2025, Region = Nordamerika), (Jahr = 2025, Region = EMEA) und so weiter.
Jede DAX-Aggregationsfunktion (SUM, AVERAGE, COUNT, MIN, MAX) wird im aktuellen Filterkontext ausgewertet. SUM(Sales[Revenue]) in einer nach 2025 + Nordamerika gefilterten Zelle summiert nur Umsatzzeilen, die beide Bedingungen erfüllen.
Zeilenkontext
Der Zeilenkontext ist in berechneten Spalten und Iteratorfunktionen vorhanden. Es bedeutet „die aktuelle Zeile“. In einer berechneten Spalte in der Tabelle „Sales“ wertet Sales[Revenue] * Sales[Quantity] jede Zeile einzeln aus.
Kontextübergang
Wenn eine Iteratorfunktion (wie SUMX) eine Kennzahl aufruft, wird der Zeilenkontext automatisch in einen Filterkontext umgewandelt. Dies wird als Kontextübergang bezeichnet. Es ist leistungsstark, kann jedoch bei Missbrauch zu Leistungsproblemen führen.
-- Row context exists here (iterating over Products)
Revenue Per Product =
SUMX(
Products,
[Total Revenue] -- This measure is evaluated in filter context
-- where the current product's ID filters the Sales table
)
Das Verständnis dieser Konzepte macht jede DAX-Formel intuitiv. Ohne sie wirken DAX-Formeln wie Blackboxen.
Die 20 wesentlichen Formeln
1. BERECHNEN – Filterkontext ändern
CALCULATE ist die wichtigste DAX-Funktion. Es wertet einen Ausdruck in einem geänderten Filterkontext aus.
Syntax: CALCULATE(expression, filter1, filter2, ...)
Beispiel: Nur Umsatz aus Großaufträgen
Large Order Revenue =
CALCULATE(
SUM(Sales[Revenue]),
Sales[OrderTotal] > 10000
)
Beispiel: Umsatz aus einer bestimmten Produktkategorie
Electronics Revenue =
CALCULATE(
SUM(Sales[Revenue]),
Products[Category] = "Electronics"
)
CALCULATE ersetzt den vorhandenen Filter für die angegebene Spalte. Wenn ein Slicer die Kategorie bereits nach „Bekleidung“ filtert, ignoriert die Kennzahl „Elektronikumsatz“ diesen Slicer und zeigt den Elektronikumsatz an, da CALCULATE den Kategoriefilter überschreibt.
2. FILTER – Filterung auf Zeilenebene
FILTER gibt eine nach einer Bedingung gefilterte Tabelle zurück. Es wird häufig in CALCULATE für komplexe Filterungen verwendet, die nicht als einfacher Spaltenvergleich ausgedrückt werden können.
Syntax: FILTER(table, condition)
Beispiel: Umsatz von Kunden mit mehr als 5 Bestellungen
Revenue From Repeat Customers =
CALCULATE(
SUM(Sales[Revenue]),
FILTER(
Customers,
CALCULATE(COUNTROWS(Sales)) > 5
)
)
Wichtig: FILTER iteriert Zeile für Zeile und ist daher langsamer als einfache CALCULATE-Filter für große Tabellen. Verwenden Sie es nur, wenn ein direkter Spaltenfilter nicht ausreicht.
3. ALLE – Alle Filter entfernen
ALL entfernt alle Filter aus einer Tabelle oder Spalte und gibt die vollständige ungefilterte Tabelle zurück. Es wird zur Berechnung von Gesamtsummen, Prozentsätzen der Gesamtsumme und Verhältnissen verwendet.
Syntax: ALL(table) oder ALL(table[column])
Beispiel: Umsatz als Prozentsatz des Gesamtumsatzes
Revenue % of Total =
DIVIDE(
SUM(Sales[Revenue]),
CALCULATE(SUM(Sales[Revenue]), ALL(Sales))
)
Wenn ein Slicer nach „Nordamerika“ filtert, gibt SUM(Sales[Revenue]) den Umsatz von Nordamerika zurück. CALCULATE(SUM(Sales[Revenue]), ALL(Sales)) entfernt alle Filter und gibt den globalen Umsatz zurück. Die Division ergibt den Prozentsatz.
4. ALLEXCEPT – Alle Filter außer den angegebenen entfernen
ALLEXCEPT entfernt alle Filter aus einer Tabelle mit Ausnahme der angegebenen Spalten. Dies ist nützlich, wenn Sie einige Filter (wie das Jahr) beibehalten und andere (wie die Produktkategorie) entfernen möchten.
Syntax: ALLEXCEPT(table, column1, column2, ...)
Beispiel: Umsatzbeteiligung innerhalb des laufenden Jahres
Revenue % of Year Total =
DIVIDE(
SUM(Sales[Revenue]),
CALCULATE(
SUM(Sales[Revenue]),
ALLEXCEPT(Sales, DateTable[Year])
)
)
Hier wird der Umsatzanteil jedes Produkts oder jeder Region innerhalb des ausgewählten Jahres angezeigt, nicht über den gesamten Zeitraum hinweg.
5. TOTALYTD – Seit Jahresbeginn
TOTALYTD berechnet im Kontext eine laufende Summe vom Jahresanfang bis zum aktuellen Datum.
Syntax: TOTALYTD(expression, dates[date_column], [filter], [year_end_date])
Beispiel: Umsatz seit Jahresbeginn
Revenue YTD =
TOTALYTD(SUM(Sales[Revenue]), DateTable[Date])
Da das Geschäftsjahr am 30. Juni endet:
Revenue Fiscal YTD =
TOTALYTD(SUM(Sales[Revenue]), DateTable[Date], "6/30")
Voraussetzung: Die DateTable muss im Modell als Datumstabelle markiert sein (Tabellentools, dann Als Datumstabelle markieren).
6. SAMEPERIODLASTYEAR – Jahr für Jahr
SAMEPERIODLASTYEAR verschiebt den Datumskontext um genau ein Jahr nach hinten.
Syntax: SAMEPERIODLASTYEAR(dates[date_column])
Beispiel: Umsatz im Vergleich zum Vorjahr
Revenue PY =
CALCULATE(SUM(Sales[Revenue]), SAMEPERIODLASTYEAR(DateTable[Date]))
Revenue YoY Growth =
VAR CurrentRevenue = SUM(Sales[Revenue])
VAR PriorRevenue = [Revenue PY]
RETURN
DIVIDE(CurrentRevenue - PriorRevenue, PriorRevenue, 0)
In einer Monatsmatrix zeigt jede Zeile den Umsatz des aktuellen Monats und des gleichen Monats des Vorjahres zusammen mit dem Wachstumsprozentsatz.
7. DATEADD – Flexible Zeitverschiebungen
DATEADD verschiebt Datumsangaben um beliebige Intervalle: Tage, Monate, Quartale oder Jahre. Es ist flexibler als SAMEPERIODLASTYEAR.
Syntax: DATEADD(dates[date_column], intervals, interval_type)
Beispiel: Umsatz vor 3 Monaten
Revenue 3 Months Ago =
CALCULATE(
SUM(Sales[Revenue]),
DATEADD(DateTable[Date], -3, MONTH)
)
Beispiel: Rollierender 12-Monats-Umsatz
Revenue Rolling 12M =
CALCULATE(
SUM(Sales[Revenue]),
DATESINPERIOD(DateTable[Date], MAX(DateTable[Date]), -12, MONTH)
)
8. RANKX – Dynamische Rankings
RANKX weist jedem Element basierend auf einem Ausdruck eine Rangfolge zu.
Syntax: RANKX(table, expression, [value], [order], [ties])
Beispiel: Produkte nach Umsatz ordnen
Product Revenue Rank =
RANKX(
ALL(Products[ProductName]),
[Total Revenue],
,
DESC,
DENSE
)
ALL(Products[ProductName]) stellt die vollständige Liste der Produkte bereit, gegen die ein Ranking erstellt werden soll, unabhängig von Slicer-Filtern für Produkte. DESC bedeutet, dass der höchste Umsatz Rang 1 erhält. DENSE bedeutet, dass gleichwertige Werte den gleichen Rang erhalten.
Beispiel: Top-N-Filter
Top 10 Products Revenue =
CALCULATE(
[Total Revenue],
FILTER(
ALL(Products[ProductName]),
RANKX(ALL(Products[ProductName]), [Total Revenue], , DESC) <= 10
)
)
9. SWITCH – Bedingte Logik
SWITCH ersetzt verschachtelte IF-Anweisungen und ist wesentlich besser lesbar.
Syntax: SWITCH(expression, value1, result1, value2, result2, ..., else_result)
Beispiel: Kundensegmentklassifizierung
Customer Segment =
SWITCH(
TRUE(),
[Total Revenue] > 100000, "Enterprise",
[Total Revenue] > 25000, "Mid-Market",
[Total Revenue] > 5000, "SMB",
"Startup"
)
Beispiel: Dynamische Kennzahlenauswahl
Selected Measure =
SWITCH(
SELECTEDVALUE(MeasureSelector[Measure]),
"Revenue", [Total Revenue],
"Orders", [Order Count],
"AOV", [Average Order Value],
"Margin", [Gross Margin %],
[Total Revenue]
)
Dieses Muster funktioniert mit einem Slicer, mit dem Benutzer auswählen können, welche Metrik in einem Diagramm angezeigt werden soll.
10. VAR / RETURN – Variablen
Variablen speichern Zwischenergebnisse, wodurch Formeln lesbar werden und redundante Berechnungen vermieden werden. Eine Variable wird einmal ausgewertet und wiederverwendet.
Syntax: VAR name = expression RETURN final_expression
Beispiel: Komplexer KPI mit Variablen
Customer Health Score =
VAR Revenue = [Total Revenue]
VAR OrderCount = [Order Count]
VAR DaysSinceLastOrder =
DATEDIFF(MAX(Sales[OrderDate]), TODAY(), DAY)
VAR RevenueScore =
SWITCH(TRUE(), Revenue > 50000, 3, Revenue > 10000, 2, 1)
VAR FrequencyScore =
SWITCH(TRUE(), OrderCount > 20, 3, OrderCount > 5, 2, 1)
VAR RecencyScore =
SWITCH(TRUE(), DaysSinceLastOrder < 30, 3, DaysSinceLastOrder < 90, 2, 1)
RETURN
RevenueScore + FrequencyScore + RecencyScore
Ohne Variablen würde diese Formel dieselben Berechnungen mehrmals wiederholen, was sie unlesbar und langsamer machen würde.
11. TEILEN – Sichere Teilung
DIVIDE verarbeitet die Division durch Null ordnungsgemäß und gibt ein angegebenes alternatives Ergebnis anstelle eines Fehlers zurück.
Syntax: DIVIDE(numerator, denominator, [alternate_result])
Beispiel:
Conversion Rate =
DIVIDE([Closed Won Deals], [Total Opportunities], 0)
Verwenden Sie in Kennzahlen immer DIVIDE anstelle des /-Operators. Der /-Operator gibt bei der Division durch Null einen Fehler zurück, wodurch Ihre Visuals beschädigt werden.
12. DISTINCTCOUNT – Eindeutige Werte zählen
DISTINCTCOUNT zählt die Anzahl der eindeutigen Werte in einer Spalte.
Syntax: DISTINCTCOUNT(column)
Beispiel: Aktive Kunden im Zeitraum
Active Customers =
DISTINCTCOUNT(Sales[CustomerID])
Hierzu zählen Einzelkunden, die im aktuellen Filterkontext (ausgewählter Monat, Quartal usw.) mindestens einen Kauf getätigt haben.
13. COUNTROWS – Zeilen in einer Tabelle zählen
COUNTROWS zählt die Anzahl der Zeilen in einer Tabelle, optional gefiltert.
Syntax: COUNTROWS(table)
Beispiel: Bestellungen zählen
Order Count =
COUNTROWS(Sales)
Cancelled Orders =
CALCULATE(
COUNTROWS(Sales),
Sales[Status] = "Cancelled"
)
14. SUMX – Zeilenweise Summe
SUMX ist ein Iterator, der einen Ausdruck für jede Zeile auswertet und die Ergebnisse summiert. Dies ist wichtig, wenn Sie Spalten vor der Summierung multiplizieren müssen.
Syntax: SUMX(table, expression)
Beispiel: Berechnung des gewichteten Durchschnitts
Weighted Average Price =
DIVIDE(
SUMX(Sales, Sales[Quantity] * Sales[UnitPrice]),
SUM(Sales[Quantity])
)
SUM kann nicht zwei Spalten multiplizieren. Sie benötigen SUMX, um die Menge mal den Einheitspreis für jede Zeile auszuwerten und dann die Ergebnisse zu summieren.
15. AVERAGEX – Zeilenweiser Durchschnitt
AVERAGEX ist die Iteratorversion von AVERAGE.
Syntax: AVERAGEX(table, expression)
Beispiel: Durchschnittliche Tage bis zum Abschluss
Average Days to Close =
AVERAGEX(
Opportunities,
DATEDIFF(Opportunities[CreatedDate], Opportunities[ClosedDate], DAY)
)
16. MAXX und MINX – Iterator Min/Max
MAXX und MINX ermitteln den Maximal- bzw. Minimalwert eines Ausdrucks, der Zeile für Zeile ausgewertet wird.
Beispiel: Spätestes Bestelldatum pro Kunde
Most Recent Order =
MAXX(Sales, Sales[OrderDate])
Oldest Unpaid Invoice =
MINX(
FILTER(Invoices, Invoices[PaymentStatus] = "Unpaid"),
Invoices[InvoiceDate]
)
17. LOOKUPVALUE – VLOOKUP-Äquivalent
LOOKUPVALUE ruft einen Wert aus einer Tabelle basierend auf einem oder mehreren Suchkriterien ab. Es ist das DAX-Äquivalent von Excels VLOOKUP.
Syntax: LOOKUPVALUE(result_column, search_column, search_value, ...)
Beispiel:
Customer Region =
LOOKUPVALUE(
Customers[Region],
Customers[CustomerID], Sales[CustomerID]
)
Hinweis: LOOKUPVALUE wird normalerweise in berechneten Spalten und nicht in Kennzahlen verwendet. Bei Kennzahlen werden RELATED (für Viele-zu-Eins) oder RELATEDTABLE (für Eins-zu-Viele) bevorzugt.
18. SELECTEDVALUE – Den aktuellen Slicer-Wert abrufen
SELECTEDVALUE gibt den Wert einer Spalte zurück, wenn sich genau ein Wert im Filterkontext befindet. Wenn mehrere Werte ausgewählt sind, wird das alternative Ergebnis zurückgegeben.
Syntax: SELECTEDVALUE(column, [alternate_result])
Beispiel: Dynamischer Titel
Chart Title =
"Revenue for " & SELECTEDVALUE(DateTable[Year], "All Years")
19. ISBLANK – Auf leere Werte prüfen
ISBLANK testet, ob ein Wert leer ist (null/leer).
Beispiel: Bestellungen ohne zugewiesenen Verkäufer
Unassigned Orders =
CALCULATE(
COUNTROWS(Sales),
ISBLANK(Sales[SalespersonID])
)
20. CONCATENATEX – Werte aus einer Tabelle verketten
CONCATENATEX durchläuft eine Tabelle und verkettet Werte zu einer einzigen Zeichenfolge.
Syntax: CONCATENATEX(table, expression, [delimiter], [order_by], [order])
Beispiel: Liste der von einem Kunden gekauften Produkte
Products Purchased =
CONCATENATEX(
VALUES(Products[ProductName]),
Products[ProductName],
", ",
Products[ProductName], ASC
)
In einer Kundendetailtabelle wird für jeden Kunden „Produkt A, Produkt B, Produkt C“ angezeigt.
Tiefer Einblick in die Zeitintelligenz
Zeitintelligenz ist der häufigste Grund, warum Geschäftsanwender DAX benötigen. Die Zeitintelligenzfunktionen von Power BI erfordern eine dedizierte Datumstabelle. Hier finden Sie eine umfassende Reihe von Zeitmessungen.
Voraussetzungen: Die Datumstabelle
Ihr Modell muss über eine Datumstabelle verfügen mit:
- Eine fortlaufende Datumsspalte (ohne Lücken), die Ihren gesamten Datenbereich abdeckt
- Die als Datumstabelle markierte Tabelle (Tabellentools, dann Als Datumstabelle markieren) – Eine Beziehung von der Datumsspalte der Datumstabelle zur Datumsspalte jeder Faktentabelle
Gängige Zeitintelligenzmaße
-- Month-to-Date
Revenue MTD =
TOTALMTD(SUM(Sales[Revenue]), DateTable[Date])
-- Quarter-to-Date
Revenue QTD =
TOTALQTD(SUM(Sales[Revenue]), DateTable[Date])
-- Year-to-Date
Revenue YTD =
TOTALYTD(SUM(Sales[Revenue]), DateTable[Date])
-- Previous Month
Revenue PM =
CALCULATE(SUM(Sales[Revenue]), PREVIOUSMONTH(DateTable[Date]))
-- Previous Quarter
Revenue PQ =
CALCULATE(SUM(Sales[Revenue]), PREVIOUSQUARTER(DateTable[Date]))
-- Previous Year
Revenue PY =
CALCULATE(SUM(Sales[Revenue]), PREVIOUSYEAR(DateTable[Date]))
-- Month-over-Month Growth
Revenue MoM % =
VAR Current = SUM(Sales[Revenue])
VAR Prior = [Revenue PM]
RETURN DIVIDE(Current - Prior, Prior, 0)
-- Year-over-Year Growth
Revenue YoY % =
VAR Current = SUM(Sales[Revenue])
VAR Prior = [Revenue PY]
RETURN DIVIDE(Current - Prior, Prior, 0)
-- Rolling 3-Month Average
Revenue 3M Avg =
AVERAGEX(
DATESINPERIOD(DateTable[Date], MAX(DateTable[Date]), -3, MONTH),
CALCULATE(SUM(Sales[Revenue]))
)
-- Cumulative Total (Running Sum)
Revenue Cumulative =
CALCULATE(
SUM(Sales[Revenue]),
FILTER(
ALL(DateTable[Date]),
DateTable[Date] <= MAX(DateTable[Date])
)
)
Zeitintelligenz für das Geschäftsjahr
Wenn Ihr Geschäftsjahr nicht mit dem Kalenderjahr übereinstimmt, verwenden Sie den optionalen Parameter „year_end_date“:
-- Fiscal Year ending March 31
Revenue Fiscal YTD =
TOTALYTD(SUM(Sales[Revenue]), DateTable[Date], "3/31")
-- Or use DATESYTD for more control
Revenue Fiscal YTD v2 =
CALCULATE(
SUM(Sales[Revenue]),
DATESYTD(DateTable[Date], "3/31")
)
Kontextübergang: Die versteckte Engine
Beim Kontextübergang handelt es sich um den Prozess, bei dem der Zeilenkontext (aus einer berechneten Spalte oder einem Iterator) beim Aufruf einer Kennzahl in einen Filterkontext umgewandelt wird. Dies ist das mächtigste und am meisten missverstandene Konzept im DAX.
Wie es funktioniert
Betrachten Sie diese Maßnahme:
Total Revenue = SUM(Sales[Revenue])
Und diese berechnete Spalte in der Tabelle „Produkte“:
Product Revenue = [Total Revenue]
In der berechneten Spalte gibt es einen Zeilenkontext (die aktuelle Produktzeile). Wenn [Total Revenue] aufgerufen wird, konvertiert der Kontextübergang den Zeilenkontext in einen Filter: CALCULATE(SUM(Sales[Revenue]), Products[ProductID] = <current row's ProductID>). Das Ergebnis ist der Umsatz für dieses spezifische Produkt.
Auswirkungen auf die Leistung
Der Kontextübergang fügt ein implizites CALCULATE um den Measure-Aufruf hinzu. Bei kleinen Tischen ist dies vernachlässigbar. Bei großen Tischen mit komplexen Maßen kann es teuer werden. Vermeiden Sie den Aufruf komplexer Kennzahlen innerhalb von Iteratoren über große Tabellen.
Ineffizient:
-- Iterates over every customer, calling a complex measure each time
Customer Profitability =
SUMX(
Customers,
[Revenue] - [COGS] - [Allocated Overhead]
)
Besser:
-- Pre-compute the components and use simple arithmetic
Customer Profitability =
SUM(Sales[Revenue]) - SUM(Sales[COGS]) -
DIVIDE(SUM(Sales[Revenue]), [Total Revenue]) * [Total Overhead]
Praktische Geschäftsszenarien
Szenario 1: ABC-Analyse (Pareto-Klassifizierung)
Klassifizieren Sie Produkte in A (oberste 80 % des Umsatzes), B (nächste 15 %) und C (untere 5 %):
ABC Class =
VAR CurrentProduct = SELECTEDVALUE(Products[ProductName])
VAR AllProducts =
ADDCOLUMNS(
ALL(Products[ProductName]),
"@Revenue", [Total Revenue]
)
VAR Sorted = TOPN(COUNTROWS(AllProducts), AllProducts, [@Revenue], DESC)
VAR TotalRev = SUMX(AllProducts, [@Revenue])
VAR CumulativeRev =
SUMX(FILTER(Sorted, [@Revenue] >= [Total Revenue]), [@Revenue])
VAR CumulativePct = DIVIDE(CumulativeRev, TotalRev)
RETURN
SWITCH(TRUE(),
CumulativePct <= 0.8, "A",
CumulativePct <= 0.95, "B",
"C"
)
Szenario 2: Kohortenbindungsanalyse
Verfolgen Sie, wie viele Kunden aus jeder Akquisitionskohorte im Laufe der Zeit aktiv bleiben:
Cohort Retention Rate =
VAR CohortMonth = SELECTEDVALUE(DateTable[YearMonth])
VAR CohortCustomers =
CALCULATE(
DISTINCTCOUNT(Sales[CustomerID]),
FILTER(
ALL(Sales),
FORMAT(Sales[FirstPurchaseDate], "YYYY-MM") = CohortMonth
)
)
VAR ActiveCustomers =
CALCULATE(
DISTINCTCOUNT(Sales[CustomerID]),
FILTER(
ALL(Sales),
FORMAT(Sales[FirstPurchaseDate], "YYYY-MM") = CohortMonth
)
)
RETURN
DIVIDE(ActiveCustomers, CohortCustomers, 0)
Szenario 3: Gleitende Jahressumme (MAT)
Eine gleitende Jahressumme glättet die Saisonalität, indem sie die letzten 12 vollständigen Monate summiert:
Revenue MAT =
CALCULATE(
SUM(Sales[Revenue]),
DATESINPERIOD(DateTable[Date], MAX(DateTable[Date]), -12, MONTH)
)
Revenue MAT Growth =
VAR Current = [Revenue MAT]
VAR Prior =
CALCULATE(
[Revenue MAT],
DATEADD(DateTable[Date], -12, MONTH)
)
RETURN
DIVIDE(Current - Prior, Prior, 0)
Iterator vs. Aggregator: Wann man jeden verwendet
Aggregatorfunktionen
SUM, AVERAGE, COUNT, MIN, MAX werden auf eine einzelne Spalte angewendet. Sie sind schnell, da die Speicher-Engine sie direkt aus komprimierten Spaltendaten auflösen kann.
Verwenden Sie, wenn: Sie eine einfache Aggregation einer Spalte benötigen.
Iteratorfunktionen
SUMX, AVERAGEX, COUNTX, MINX, MAXX, RANKX werten einen Ausdruck Zeile für Zeile aus. Sie sind flexibler, aber langsamer, da die Formel-Engine jede Zeile verarbeitet.
Verwenden Sie, wenn:
- Sie müssen die Spalten vor dem Aggregieren multiplizieren (SUMX für gewichtete Berechnungen).
- Sie müssen eine Bedingung pro Zeile anwenden (COUNTX mit IF)
- Sie müssen Elemente einordnen (RANKX) – Die Berechnung hängt von Werten aus zugehörigen Tabellen ab, die eine Auswertung auf Zeilenebene erfordern
Leistungs-Faustregel: Wenn mit einem Aggregator das gleiche Ergebnis erzielt werden kann, verwenden Sie den Aggregator. Verwenden Sie Iteratoren nur, wenn die zeilenweise Auswertung erforderlich ist.
Debuggen von DAX
Häufige Fehlermeldungen
| Fehler | Ursache | Fix |
|---|---|---|
| „Ein einzelner Wert für Spalte X wird erwartet“ | Measure gibt mehrere Werte zurück, wo einer erwartet wird | Verwenden Sie SELECTEDVALUE, MAX oder CALCULATE, um den Wert auf einen Wert zu reduzieren |
| „Zirkuläre Abhängigkeit“ | Zwei berechnete Spalten oder Kennzahlen verweisen aufeinander | Entwerfen Sie die Berechnungskette neu, um den Zyklus |
| „Beziehungen können nicht ermittelt werden“ | Mehrdeutiger Beziehungspfad zwischen Tabellen | Geben Sie die Beziehung in USERELATIONSHIP an oder aktivieren Sie sie |
| „Der Ausdruck bezieht sich auf mehrere Spalten“ | ALL/VALUES wird fälschlicherweise mit mehreren Spalten verwendet | Verwenden Sie ALL(Table) oder ALL(Table[Col1], Table[Col2]) |
Leistungsanalysator
Der Leistungsanalysator von Power BI Desktop (Ansicht, dann Leistungsanalysator) zeigt die DAX-Abfrage und die Ausführungszeit für jedes Visual an. Verwenden Sie es, um:
- Identifizieren Sie langsame Bilder (über 1 Sekunde)
- Kopieren Sie die DAX-Abfrage zur detaillierten Analyse in DAX Studio
- Vergleichen Sie bei der Optimierung von Maßnahmen die Ausführungszeiten vor/nachher
DAX Studio
DAX Studio ist ein kostenloses externes Tool, das eine detaillierte Abfrageanalyse ermöglicht. Es zeigt:
- Speicher-Engine-Abfragen (schnelle Spaltenspeicher-Scans)
- Formel-Engine-Abfragen (langsamer, zeilenweise Auswertung)
- Materialisierungsgrößen (Daten werden zwischen Engines gemischt)
Wenn eine Kennzahl viele Formel-Engine-Abfragen generiert, verwendet sie wahrscheinlich zu viele Iteratoren oder komplexe FILTER-Ausdrücke. Refactoring, um mehr Arbeit auf die Speicher-Engine zu übertragen.
Für die Power BI-Schulung, die DAX von den Grundlagen bis zur erweiterten Optimierung abdeckt, bietet ECOSIRE praxisorientierte Workshops an, die auf Ihre spezifischen Datensätze und Geschäftsfragen zugeschnitten sind.
FAQ
Was ist der Unterschied zwischen einer Kennzahl und einer berechneten Spalte?
Eine Kennzahl wird zum Zeitpunkt der Abfrage im aktuellen Filterkontext ausgewertet. Der Tabelle werden keine Daten hinzugefügt, sondern ein Wert dynamisch berechnet. Eine berechnete Spalte wird zum Zeitpunkt der Datenaktualisierung ausgewertet und fügt der Tabelle eine physische Spalte hinzu. Verwenden Sie Kennzahlen für Aggregationen und KPIs, die sich basierend auf Slicern und Filtern ändern. Verwenden Sie berechnete Spalten für Klassifizierungen oder Werte auf Zeilenebene, die in Slicern, Filtern oder Beziehungen verwendet werden müssen. Maßnahmen werden fast immer bevorzugt, da sie die Modellgröße nicht vergrößern.
Warum zeigt mein YTD-Messwert falsche Werte an?
Die häufigste Ursache ist, dass Ihre Datumstabelle nicht richtig konfiguriert ist. Überprüfen Sie drei Dinge: (1) Die Datumstabelle weist keine Lücken auf – jedes Datum vom Beginn Ihrer Daten bis zur Gegenwart muss enthalten sein, (2) die Tabelle ist in Power BI als Datumstabelle markiert (Tabellentools, dann als Datumstabelle markieren) und (3) die Beziehung zwischen der Datumstabelle und Ihrer Faktentabelle ist aktiv und korrekt zugeordnet. Stellen Sie außerdem sicher, dass Ihre Datumsspalte keine Zeitkomponente enthält, die eine genaue Übereinstimmung verhindert.
Wann sollte ich CALCULATE im Vergleich zu FILTER verwenden?
Verwenden Sie CALCULATE, wenn Sie den Filter als einfachen Spaltenvergleich ausdrücken können (z. B. Products[Category] = "Electronics"). CALCULATE wandelt dies in einen effizienten Filter um, den die Speicher-Engine optimieren kann. Verwenden Sie FILTER, wenn Sie komplexe zeilenweise Bedingungen benötigen, die auf mehrere Spalten oder Aufrufkennzahlen verweisen (z. B. zum Filtern von Kunden, bei denen CALCULATE(COUNTROWS(Sales)) > 5 ist). FILTER ist ein Iterator und langsamer. Bevorzugen Sie daher nach Möglichkeit die einfache Syntax von CALCULATE.
Wie erstelle ich eine laufende Summe oder kumulative Summe in DAX?
Verwenden Sie CALCULATE mit einem Filter, der alle Daten bis zum aktuellen Datum umfasst: Revenue Cumulative = CALCULATE(SUM(Sales[Revenue]), FILTER(ALL(DateTable[Date]), DateTable[Date] <= MAX(DateTable[Date]))). Dadurch wird der vorhandene Datumsfilter (ALLE) entfernt und durch einen Filter ersetzt, der alle Datumsangaben vom Anfang bis zum maximalen Datum im aktuellen Kontext umfasst. In einer Monatsmatrix zeigt jede Zeile die kumulierte Gesamtsumme für diesen Monat.
Kann ich DAX verwenden, um Daten zurück in die Datenbank zu schreiben?
Nein. DAX ist eine schreibgeschützte Abfragesprache. Es kann Daten zur Anzeige berechnen, filtern und transformieren, aber keine Daten in die Quelldatenbank einfügen, aktualisieren oder löschen. Verwenden Sie für Rückschreibszenarien Power Apps, die in Power BI eingebettet sind, oder verwenden Sie Power Automate-Flows, die durch Power BI-Warnungen ausgelöst werden. Einige Tools von Drittanbietern (Acterys, Writeback Manager) fügen Writeback-Funktionen durch benutzerdefinierte Visuals hinzu.
Geschrieben von
ECOSIRE Research and Development Team
Entwicklung von Enterprise-Digitalprodukten bei ECOSIRE. Einblicke in Odoo-Integrationen, E-Commerce-Automatisierung und KI-gestützte Geschäftslösungen.
Verwandte Artikel
Power BI AI-Funktionen: Copilot, AutoML und Predictive Analytics
Beherrschen Sie die KI-Funktionen von Power BI, darunter Copilot für Berichte in natürlicher Sprache, AutoML für Vorhersagen, Anomalieerkennung und intelligente Erzählungen. Lizenzierungsleitfaden.
Vollständiger Leitfaden zur Power BI-Dashboard-Entwicklung
Erfahren Sie, wie Sie effektive Power BI-Dashboards mit KPI-Design, visuellen Best Practices, Drill-Through-Seiten, Lesezeichen, mobilen Layouts und RLS-Sicherheit erstellen.
Power BI-Datenmodellierung: Star-Schema-Design für Business Intelligence
Beherrschen Sie die Power BI-Datenmodellierung mit Star-Schema-Design, Fakten- und Dimensionstabellen, DAX-Kennzahlen, Berechnungsgruppen, Zeitintelligenz und zusammengesetzten Modellen.
Mehr aus Data Analytics & BI
Vollständiger Leitfaden zur Power BI-Dashboard-Entwicklung
Erfahren Sie, wie Sie effektive Power BI-Dashboards mit KPI-Design, visuellen Best Practices, Drill-Through-Seiten, Lesezeichen, mobilen Layouts und RLS-Sicherheit erstellen.
Power BI Embedded: Hinzufügen von Analysen zu Ihrer Anwendung
Betten Sie Power BI-Analysen in Ihre SaaS-App ein. Deckt Authentifizierung, mandantenfähiges RLS, Kapazitätsdimensionierung, JavaScript SDK, benutzerdefinierte Designs und Fabric-Preise ab.
Migration von Excel zu Power BI: Schritt-für-Schritt-Anleitung
Vollständiger Leitfaden zur Migration von Excel zu Power BI mit Formelübersetzung, Datenmodellerstellung, Power Query, Validierung und Außerbetriebnahme.
Der vollständige Leitfaden zur Power BI + Odoo-Integration
Verbinden Sie Power BI mit Odoo ERP für erweiterte Analysen. PostgreSQL-Direktabfragen, Schlüsseltabellen, Vertriebs-/Bestands-/HR-Dashboards und inkrementelle Aktualisierungseinrichtung.
Messung des KI-ROI in Unternehmen: Ein Rahmenwerk, das tatsächlich funktioniert
Ein praktischer Rahmen zur Messung des KI-Return on Investment, der direkte Einsparungen, Produktivitätssteigerungen, Umsatzauswirkungen und strategischen Wert über Abteilungen hinweg umfasst.
Erstellen von Finanzberichts-Dashboards: KPIs, Design und ERP-Integration
Entwerfen Sie Dashboards für die Finanzberichterstattung, die Entscheidungen vorantreiben. Erfahren Sie, welche KPIs Sie verfolgen sollten, welche Dashboard-Designprinzipien es gibt und welche Best Practices für die ERP-Integration Sie nutzen.