DAX-Formeln, die jeder Geschäftsanwender kennen sollte

Beherrschen Sie 20 wichtige DAX-Formeln für Power BI. CALCULATE, Zeitintelligenz, RANKX, Kontextübergang, Iteratoren und praktische Geschäftsbeispiele.

E
ECOSIRE Research and Development Team
|17. März 202615 Min. Lesezeit3.4k Wörter|

Teil unserer Data Analytics & BI-Serie

Den vollständigen Leitfaden lesen

DAX-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

FehlerUrsacheFix
„Ein einzelner Wert für Spalte X wird erwartet“Measure gibt mehrere Werte zurück, wo einer erwartet wirdVerwenden Sie SELECTEDVALUE, MAX oder CALCULATE, um den Wert auf einen Wert zu reduzieren
„Zirkuläre Abhängigkeit“Zwei berechnete Spalten oder Kennzahlen verweisen aufeinanderEntwerfen Sie die Berechnungskette neu, um den Zyklus
„Beziehungen können nicht ermittelt werden“Mehrdeutiger Beziehungspfad zwischen TabellenGeben 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 verwendetVerwenden 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:

  1. Identifizieren Sie langsame Bilder (über 1 Sekunde)
  2. Kopieren Sie die DAX-Abfrage zur detaillierten Analyse in DAX Studio
  3. 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.

E

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.

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.

Chatten Sie auf WhatsApp