DAX und Datenmodelle

CALCULATE in Power BI: Schritt für Schritt erklärt

CALCULATE wertet einen DAX-Ausdruck unter Filtern aus. Syntax, ein Measure Schritt für Schritt, Verhalten bei Slicern und wann KEEPFILTERS sinnvoll ist.

Sajagan Thirugnanam

·

Aktualisiert

CALCULATE ist die DAX-Funktion, die einen Ausdruck, meist eine Summe oder eine Anzahl, unter Filtern auswertet, die Sie festlegen. Sie übergeben zuerst den Ausdruck und dann einen oder mehrere Filter, zum Beispiel CALCULATE ( SUM ( Sales[Sales Amount] ), Sales[Product Type] = "Electronics" ). Power BI fügt diese Filter zu den Filtern hinzu, die der Report ohnehin anwendet, oder ersetzt den bestehenden Filter, wenn er auf derselben Spalte liegt, und berechnet dann das Ergebnis.

Fast jedes nicht triviale Measure in einem Power-BI-Report nutzt sie: Umsatz einer Region, Umsatz des Vorjahres, ein Anteil am Gesamtwert.

Was ist die Funktion CALCULATE in Power BI?

Die engste Entsprechung in Excel ist SUMIF. SUMIF addiert eine Spalte nur für die Zeilen, die eine Bedingung erfüllen. CALCULATE leistet dasselbe, mit zwei Unterschieden:

  • Die Bedingung kann auf jeder Tabelle im Modell liegen. Ein Filter auf der Tabelle Customer erreicht die Tabelle Sales über die Beziehung zwischen beiden.

  • Sie funktioniert mit jedem Ausdruck, nicht nur mit einer Summe. Sie kann COUNT, AVERAGE, DISTINCTCOUNT oder ein anderes Measure umschließen.

Ein Beispiel, wie CALCULATE funktioniert

Mit CALCULATE liefern Sie den Gesamtgewinn einer Stadt, den Gesamtumsatz eines Produkts oder den Umsatz eines Jahres, alles aus derselben Tabelle Sales. Jedes Mal ist es dieselbe Aggregation mit einem anderen Filter. Möglich macht das die folgende Syntax.

Grundsyntax der Funktion CALCULATE

CALCULATE besteht aus zwei Teilen: dem Ausdruck und den Filtern.

CALCULATE ( <expression> [, <filter1> [, <filter2>
  • Der Ausdruck ist das, was Sie berechnen wollen, zum Beispiel SUM ( Sales[Sales Amount] ) oder ein vorhandenes Measure wie [Total Sales].

  • Die Filter sind optional und durch Kommas getrennt. Wenn Sie mehrere übergeben, gelten alle gleichzeitig, wie bei AND.

Ein Filterargument kann eine von drei Formen haben:

Filterform

Beispiel

Einsatz

Boolescher Ausdruck

'Product'[Color] = "Blue"

Einfache Bedingungen auf Spalten einer Tabelle. Die schnellste Option.

Tabellenausdruck

FILTER ( VALUES ( 'Date'[Month] ), [Profit] > 0 )

Bedingungen, die ein Measure brauchen oder Spalten über Tabellen hinweg vergleichen.

Filtermodifikator

REMOVEFILTERS ( 'Product' ), KEEPFILTERS ( ... ), USERELATIONSHIP ( ... )

Filter entfernen, bestehende Filter beibehalten oder Beziehungen wechseln.

Ein boolescher Filter darf nur Spalten einer Tabelle verwenden. Er kann kein Measure referenzieren und kein weiteres CALCULATE enthalten. Brauchen Sie eines von beiden, nutzen Sie FILTER.

So nutzen Sie die Funktion CALCULATE in Power BI

  1. Klicken Sie im Datenbereich mit der rechten Maustaste auf die Tabelle, die das neue Measure enthalten soll, und wählen Sie Neues Measure. Eine eigene Measures-Tabelle ist dafür ein guter Ort.

    Rechtsklickmenü im Datenbereich von Power BI Desktop mit gelb markierter Option Neues Measure

    Rechtsklick auf eine Tabelle im Datenbereich > Neues Measure.

  2. Geben Sie in der Bearbeitungsleiste den Namen des Measures, ein Gleichheitszeichen und den CALCULATE-Ausdruck ein und drücken Sie die Eingabetaste.

    Menüband Measuretools und Bearbeitungsleiste von Power BI Desktop mit einem Measure Churn Customer Count, das DISTINCTCOUNT von subscription MCID in CALCULATE mit einem FILTER auf Churn Type gleich Full Churn umschließt

    Ein CALCULATE-Measure in der Bearbeitungsleiste, darüber das Menüband Measuretools.

  3. Legen Sie im Menüband Measuretools das Format fest, zum Beispiel Ganze Zahl oder Prozent. Das Measure erscheint dann im Datenbereich unter der gewählten Tabelle.

Das Measure im Screenshot zählt Kunden mit vollständiger Abwanderung:

Churn Customer Count =
CALCULATE (
    DISTINCTCOUNT ( subscription[MCID] ),
    FILTER ( subscription, subscription[Churn Type] = "Full Churn" )
)

Es funktioniert, aber FILTER geht jede Zeile der Tabelle subscription durch. Microsoft empfiehlt überall dort einen booleschen Filter, wo er möglich ist, weil die Engine eine einzelne Spalte viel schneller filtert. Mit KEEPFILTERS verhält sich der Filter wie die FILTER-Version, wenn zusätzlich ein Slicer auf Churn Type gesetzt ist:

Churn Customer Count =
CALCULATE (
    DISTINCTCOUNT ( subscription[MCID] ),
    KEEPFILTERS ( subscription[Churn Type] = "Full Churn" )
)

Wann Sie die Funktion CALCULATE nutzen

Nutzen Sie CALCULATE immer dann, wenn ein Measure einen Filter braucht, den der Report nicht ohnehin anwendet. Nehmen Sie eine Tabelle Sales mit drei Spalten: Product Type, Sales Amount und Date. So liefern Sie den Umsatz mit Electronics im Jahr 2023:

Electronics_Sales_2023 =
CALCULATE (
    SUM ( Sales[Sales Amount] ),
    Sales[Product Type] = "Electronics",
    YEAR ( Sales[Date] ) = 2023
)
  • SUM ( Sales[Sales Amount] ) ist der Ausdruck.

  • Sales[Product Type] = "Electronics" behält nur Zeilen mit Electronics.

  • YEAR ( Sales[Date] ) = 2023 behält nur Zeilen mit einem Datum im Jahr 2023.

Wenn das Modell eine Datumstabelle hat, filtern Sie stattdessen auf ihr, zum Beispiel 'Date'[Year] = 2023. Dieser Filter erreicht jede Faktentabelle, die mit der Datumstabelle verbunden ist.

Was mit Slicern auf derselben Spalte passiert

Ein Filterargument ersetzt jeden bestehenden Filter auf derselben Spalte. Wählt ein Leser des Reports in einem Slicer für Product Type den Wert Furniture, zeigt Electronics_Sales_2023 weiterhin den Umsatz mit Electronics. Der Filter auf Product Type überschreibt den Slicer. Filter auf anderen Spalten, etwa Region, gelten weiterhin.

Das ist richtig für einen festen Vergleichswert und falsch für ein Measure, das dem Slicer folgen soll. Umschließen Sie den Filter mit KEEPFILTERS, um ihn zusätzlich zum Slicer anzuwenden:

Electronics_Sales_2023 Kept =
CALCULATE (
    SUM ( Sales[Sales Amount] ),
    KEEPFILTERS ( Sales[Product Type] = "Electronics" ),
    YEAR ( Sales[Date] ) = 2023
)

Ist Furniture gewählt, liefert diese Version einen leeren Wert, denn keine Zeile ist zugleich Furniture und Electronics. Woher die bestehenden Filter kommen, erklärt der Beitrag Zeilenkontext und Filterkontext.

Ein weiterer Praxisfall für die Funktion CALCULATE

Filter können auf verschiedenen Tabellen liegen. So liefern Sie den Umsatz von Kunden in City A, die älter als 45 sind:

Revenue City A Over 45 =
CALCULATE (
    SUM ( Sales[Revenue] ),
    Customer[City] = "City A",
    Customer[Age] > 45
)

Beide Filter liegen auf der Tabelle Customer, und die Beziehung von Customer zu Sales trägt sie zu den Umsatzzeilen.

CALCULATE entfernt auch Filter. Dieses Measure teilt durch den Umsatz, bei dem jeder Filter auf der Tabelle Customer aufgehoben ist. So zeigt jede Zeile eines Visuals ihren Anteil am Umsatz aller Kunden:

Revenue % of All Customers =
DIVIDE (
    SUM ( Sales[Revenue] ),
    CALCULATE ( SUM ( Sales[Revenue] ), REMOVEFILTERS ( Customer ) )
)

Für eine Summe, die die Slicer weiterhin beachtet, lesen Sie ALLSELECTED vs. ALL.

Schlussbemerkung

Beginnen Sie mit dem booleschen Filter und greifen Sie nur dann zu FILTER, wenn eine Bedingung ein Measure oder Spalten aus zwei Tabellen braucht. Testen Sie jedes neue CALCULATE-Measure mit einem Slicer auf der Spalte, die es filtert. So sehen Sie, ob es den Slicer ersetzen oder beachten soll. Ist ein CALCULATE-Measure langsam, nennt der Leitfaden zur DAX-Performance die üblichen Ursachen. Der Beitrag SUM vs. SUMX behandelt die Aggregationen, die Sie am häufigsten darin verwenden.

FAQs

Wirkt CALCULATE auf den ganzen Report oder nur auf bestimmte Measures?

Nur auf das Measure, in dem es steht. CALCULATE ändert die Filter für seinen eigenen Ausdruck und sonst nichts. Andere Measures und Visuals bleiben unberührt, es sei denn, ein anderes Measure verweist auf dieses. Dann liefert es das gefilterte Ergebnis dieses Measures.

Kann ich die Funktion CALCULATE verschachteln?

Ja. Das innere CALCULATE wird innerhalb der Filter ausgewertet, die das äußere setzt. Filtern beide dieselbe Spalte, gewinnt der innere Filter. Verschachtelung ist zulässig, aber schwer lesbar. Zwei Filterargumente in einem CALCULATE oder eine Variable mit dem inneren Ergebnis sind meist klarer.

Kann ich mehrere Filterargumente mit der Funktion CALCULATE verwenden?

Ja. Trennen Sie sie mit Kommas, wie in den Beispielen oben. Alle gelten gleichzeitig, eine Zeile muss also jede Bedingung erfüllen.

Unterstützt CALCULATE logische Operatoren wie AND, OR, NOT?

Ja, mit Grenzen. Innerhalb eines booleschen Filters können Sie &&, || und NOT verwenden, solange alle Spalten aus derselben Tabelle stammen:

Red or Blue Sales =
CALCULATE (
    SUM ( Sales[Sales Amount] ),
    'Product'[Color] = "Red" || 'Product'[Color] = "Blue"
)

Für ein OR über Spalten aus zwei verschiedenen Tabellen nutzen Sie FILTER über einer Tabelle, die beide Spalten erreicht, zum Beispiel FILTER ( Sales, RELATED ( Customer[City] ) = "City A" || Sales[Revenue] > 1000 ).

Quellen

CALCULATE ist die DAX-Funktion, die einen Ausdruck, meist eine Summe oder eine Anzahl, unter Filtern auswertet, die Sie festlegen. Sie übergeben zuerst den Ausdruck und dann einen oder mehrere Filter, zum Beispiel CALCULATE ( SUM ( Sales[Sales Amount] ), Sales[Product Type] = "Electronics" ). Power BI fügt diese Filter zu den Filtern hinzu, die der Report ohnehin anwendet, oder ersetzt den bestehenden Filter, wenn er auf derselben Spalte liegt, und berechnet dann das Ergebnis.

Fast jedes nicht triviale Measure in einem Power-BI-Report nutzt sie: Umsatz einer Region, Umsatz des Vorjahres, ein Anteil am Gesamtwert.

Was ist die Funktion CALCULATE in Power BI?

Die engste Entsprechung in Excel ist SUMIF. SUMIF addiert eine Spalte nur für die Zeilen, die eine Bedingung erfüllen. CALCULATE leistet dasselbe, mit zwei Unterschieden:

  • Die Bedingung kann auf jeder Tabelle im Modell liegen. Ein Filter auf der Tabelle Customer erreicht die Tabelle Sales über die Beziehung zwischen beiden.

  • Sie funktioniert mit jedem Ausdruck, nicht nur mit einer Summe. Sie kann COUNT, AVERAGE, DISTINCTCOUNT oder ein anderes Measure umschließen.

Ein Beispiel, wie CALCULATE funktioniert

Mit CALCULATE liefern Sie den Gesamtgewinn einer Stadt, den Gesamtumsatz eines Produkts oder den Umsatz eines Jahres, alles aus derselben Tabelle Sales. Jedes Mal ist es dieselbe Aggregation mit einem anderen Filter. Möglich macht das die folgende Syntax.

Grundsyntax der Funktion CALCULATE

CALCULATE besteht aus zwei Teilen: dem Ausdruck und den Filtern.

CALCULATE ( <expression> [, <filter1> [, <filter2>
  • Der Ausdruck ist das, was Sie berechnen wollen, zum Beispiel SUM ( Sales[Sales Amount] ) oder ein vorhandenes Measure wie [Total Sales].

  • Die Filter sind optional und durch Kommas getrennt. Wenn Sie mehrere übergeben, gelten alle gleichzeitig, wie bei AND.

Ein Filterargument kann eine von drei Formen haben:

Filterform

Beispiel

Einsatz

Boolescher Ausdruck

'Product'[Color] = "Blue"

Einfache Bedingungen auf Spalten einer Tabelle. Die schnellste Option.

Tabellenausdruck

FILTER ( VALUES ( 'Date'[Month] ), [Profit] > 0 )

Bedingungen, die ein Measure brauchen oder Spalten über Tabellen hinweg vergleichen.

Filtermodifikator

REMOVEFILTERS ( 'Product' ), KEEPFILTERS ( ... ), USERELATIONSHIP ( ... )

Filter entfernen, bestehende Filter beibehalten oder Beziehungen wechseln.

Ein boolescher Filter darf nur Spalten einer Tabelle verwenden. Er kann kein Measure referenzieren und kein weiteres CALCULATE enthalten. Brauchen Sie eines von beiden, nutzen Sie FILTER.

So nutzen Sie die Funktion CALCULATE in Power BI

  1. Klicken Sie im Datenbereich mit der rechten Maustaste auf die Tabelle, die das neue Measure enthalten soll, und wählen Sie Neues Measure. Eine eigene Measures-Tabelle ist dafür ein guter Ort.

    Rechtsklickmenü im Datenbereich von Power BI Desktop mit gelb markierter Option Neues Measure

    Rechtsklick auf eine Tabelle im Datenbereich > Neues Measure.

  2. Geben Sie in der Bearbeitungsleiste den Namen des Measures, ein Gleichheitszeichen und den CALCULATE-Ausdruck ein und drücken Sie die Eingabetaste.

    Menüband Measuretools und Bearbeitungsleiste von Power BI Desktop mit einem Measure Churn Customer Count, das DISTINCTCOUNT von subscription MCID in CALCULATE mit einem FILTER auf Churn Type gleich Full Churn umschließt

    Ein CALCULATE-Measure in der Bearbeitungsleiste, darüber das Menüband Measuretools.

  3. Legen Sie im Menüband Measuretools das Format fest, zum Beispiel Ganze Zahl oder Prozent. Das Measure erscheint dann im Datenbereich unter der gewählten Tabelle.

Das Measure im Screenshot zählt Kunden mit vollständiger Abwanderung:

Churn Customer Count =
CALCULATE (
    DISTINCTCOUNT ( subscription[MCID] ),
    FILTER ( subscription, subscription[Churn Type] = "Full Churn" )
)

Es funktioniert, aber FILTER geht jede Zeile der Tabelle subscription durch. Microsoft empfiehlt überall dort einen booleschen Filter, wo er möglich ist, weil die Engine eine einzelne Spalte viel schneller filtert. Mit KEEPFILTERS verhält sich der Filter wie die FILTER-Version, wenn zusätzlich ein Slicer auf Churn Type gesetzt ist:

Churn Customer Count =
CALCULATE (
    DISTINCTCOUNT ( subscription[MCID] ),
    KEEPFILTERS ( subscription[Churn Type] = "Full Churn" )
)

Wann Sie die Funktion CALCULATE nutzen

Nutzen Sie CALCULATE immer dann, wenn ein Measure einen Filter braucht, den der Report nicht ohnehin anwendet. Nehmen Sie eine Tabelle Sales mit drei Spalten: Product Type, Sales Amount und Date. So liefern Sie den Umsatz mit Electronics im Jahr 2023:

Electronics_Sales_2023 =
CALCULATE (
    SUM ( Sales[Sales Amount] ),
    Sales[Product Type] = "Electronics",
    YEAR ( Sales[Date] ) = 2023
)
  • SUM ( Sales[Sales Amount] ) ist der Ausdruck.

  • Sales[Product Type] = "Electronics" behält nur Zeilen mit Electronics.

  • YEAR ( Sales[Date] ) = 2023 behält nur Zeilen mit einem Datum im Jahr 2023.

Wenn das Modell eine Datumstabelle hat, filtern Sie stattdessen auf ihr, zum Beispiel 'Date'[Year] = 2023. Dieser Filter erreicht jede Faktentabelle, die mit der Datumstabelle verbunden ist.

Was mit Slicern auf derselben Spalte passiert

Ein Filterargument ersetzt jeden bestehenden Filter auf derselben Spalte. Wählt ein Leser des Reports in einem Slicer für Product Type den Wert Furniture, zeigt Electronics_Sales_2023 weiterhin den Umsatz mit Electronics. Der Filter auf Product Type überschreibt den Slicer. Filter auf anderen Spalten, etwa Region, gelten weiterhin.

Das ist richtig für einen festen Vergleichswert und falsch für ein Measure, das dem Slicer folgen soll. Umschließen Sie den Filter mit KEEPFILTERS, um ihn zusätzlich zum Slicer anzuwenden:

Electronics_Sales_2023 Kept =
CALCULATE (
    SUM ( Sales[Sales Amount] ),
    KEEPFILTERS ( Sales[Product Type] = "Electronics" ),
    YEAR ( Sales[Date] ) = 2023
)

Ist Furniture gewählt, liefert diese Version einen leeren Wert, denn keine Zeile ist zugleich Furniture und Electronics. Woher die bestehenden Filter kommen, erklärt der Beitrag Zeilenkontext und Filterkontext.

Ein weiterer Praxisfall für die Funktion CALCULATE

Filter können auf verschiedenen Tabellen liegen. So liefern Sie den Umsatz von Kunden in City A, die älter als 45 sind:

Revenue City A Over 45 =
CALCULATE (
    SUM ( Sales[Revenue] ),
    Customer[City] = "City A",
    Customer[Age] > 45
)

Beide Filter liegen auf der Tabelle Customer, und die Beziehung von Customer zu Sales trägt sie zu den Umsatzzeilen.

CALCULATE entfernt auch Filter. Dieses Measure teilt durch den Umsatz, bei dem jeder Filter auf der Tabelle Customer aufgehoben ist. So zeigt jede Zeile eines Visuals ihren Anteil am Umsatz aller Kunden:

Revenue % of All Customers =
DIVIDE (
    SUM ( Sales[Revenue] ),
    CALCULATE ( SUM ( Sales[Revenue] ), REMOVEFILTERS ( Customer ) )
)

Für eine Summe, die die Slicer weiterhin beachtet, lesen Sie ALLSELECTED vs. ALL.

Schlussbemerkung

Beginnen Sie mit dem booleschen Filter und greifen Sie nur dann zu FILTER, wenn eine Bedingung ein Measure oder Spalten aus zwei Tabellen braucht. Testen Sie jedes neue CALCULATE-Measure mit einem Slicer auf der Spalte, die es filtert. So sehen Sie, ob es den Slicer ersetzen oder beachten soll. Ist ein CALCULATE-Measure langsam, nennt der Leitfaden zur DAX-Performance die üblichen Ursachen. Der Beitrag SUM vs. SUMX behandelt die Aggregationen, die Sie am häufigsten darin verwenden.

FAQs

Wirkt CALCULATE auf den ganzen Report oder nur auf bestimmte Measures?

Nur auf das Measure, in dem es steht. CALCULATE ändert die Filter für seinen eigenen Ausdruck und sonst nichts. Andere Measures und Visuals bleiben unberührt, es sei denn, ein anderes Measure verweist auf dieses. Dann liefert es das gefilterte Ergebnis dieses Measures.

Kann ich die Funktion CALCULATE verschachteln?

Ja. Das innere CALCULATE wird innerhalb der Filter ausgewertet, die das äußere setzt. Filtern beide dieselbe Spalte, gewinnt der innere Filter. Verschachtelung ist zulässig, aber schwer lesbar. Zwei Filterargumente in einem CALCULATE oder eine Variable mit dem inneren Ergebnis sind meist klarer.

Kann ich mehrere Filterargumente mit der Funktion CALCULATE verwenden?

Ja. Trennen Sie sie mit Kommas, wie in den Beispielen oben. Alle gelten gleichzeitig, eine Zeile muss also jede Bedingung erfüllen.

Unterstützt CALCULATE logische Operatoren wie AND, OR, NOT?

Ja, mit Grenzen. Innerhalb eines booleschen Filters können Sie &&, || und NOT verwenden, solange alle Spalten aus derselben Tabelle stammen:

Red or Blue Sales =
CALCULATE (
    SUM ( Sales[Sales Amount] ),
    'Product'[Color] = "Red" || 'Product'[Color] = "Blue"
)

Für ein OR über Spalten aus zwei verschiedenen Tabellen nutzen Sie FILTER über einer Tabelle, die beide Spalten erreicht, zum Beispiel FILTER ( Sales, RELATED ( Customer[City] ) = "City A" || Sales[Revenue] > 1000 ).

Quellen

Zeigen Sie uns Ihren Report, dem niemand traut.

1 · Ein Gespräch von 30 Minuten.

2 · Wir sehen uns gemeinsam Ihre aktuellen Reports an.

3 · Wir sagen Ihnen, was wir tun würden.

Zeigen Sie uns Ihren Report, dem niemand traut.

1 · Ein Gespräch von 30 Minuten.

2 · Wir sehen uns gemeinsam Ihre aktuellen Reports an.

3 · Wir sagen Ihnen, was wir tun würden.

Zeigen Sie uns Ihren Report, dem niemand traut.

1 · Ein Gespräch von 30 Minuten.

2 · Wir sehen uns gemeinsam Ihre aktuellen Reports an.

3 · Wir sagen Ihnen, was wir tun würden.

CaseWhen ist eine BI-Beratung aus Berlin. Wir bauen Reporting, dem die Geschäftsführung vertraut, auf dem Microsoft-Stack: Power BI, Fabric und Azure.

Berlin, Deutschland

© CaseWhen Consulting GmbH

Deutsch

CaseWhen ist eine BI-Beratung aus Berlin. Wir bauen Reporting, dem die Geschäftsführung vertraut, auf dem Microsoft-Stack: Power BI, Fabric und Azure.

Berlin, Deutschland

© CaseWhen Consulting GmbH

Deutsch

CaseWhen ist eine BI-Beratung aus Berlin. Wir bauen Reporting, dem die Geschäftsführung vertraut, auf dem Microsoft-Stack: Power BI, Fabric und Azure.

Berlin, Deutschland

© CaseWhen Consulting GmbH

Deutsch