Berechnungsgruppen

Gilt für: SQL Server 2019 und höher Analysis Services Azure Analysis Services Fabric/Power BI Premium

Berechnungsgruppen können die Anzahl der redundanten Measures deutlich reduzieren, indem sie gängige Measure-Ausdrücke als Berechnungselemente gruppieren. Berechnungsgruppen werden in tabellarischen Modellen mit dem Kompatibilitätsgrad 1500 und höher unterstützt.

Vorteile

Berechnungsgruppen behandeln ein Problem in komplexen Modellen, bei denen es zu einer Vermehrung redundanter Measures mit den gleichen Berechnungen kommen kann – am häufigsten bei Zeitintelligenzberechnungen. Ein Vertriebsanalyst möchte z. B. die Gesamtsummen und Bestellungen nach MtD (Month-to-Date), Quarter-to-Date (QTD), Year-to-Date (YTD), Bestellungen im Vorjahr (Py) usw. anzeigen. Der Datenmodellierer muss für jede Berechnung separate Measures erstellen, was zu Dutzenden von Measures führen kann. Für den Benutzer kann dies bedeuten, dass er genauso viele Measures sortieren und diese einzeln auf seinen Bericht anwenden muss.

Sehen wir uns zunächst an, wie Berechnungsgruppen für Benutzer in einem Berichterstellungstool wie Power BI angezeigt werden. Anschließend wird untersucht, was eine Berechnungsgruppe bildet und wie sie in einem Modell erstellt wird.

Berechnungsgruppen werden in Berichterstellungsclients als Tabelle mit einer einzigen Spalte angezeigt. Die Spalte ähnelt nicht einer typischen Spalte oder Dimension, sondern stellt eine oder mehrere wiederverwendbare Berechnungen oder Berechnungselemente dar, die auf jedes Measure angewendet werden können, das bereits dem Filter Werte für eine Visualisierung hinzugefügt wurde.

In der folgenden Animation analysiert ein Benutzer Umsatzdaten für die Jahre 2012 und 2013. Vor dem Anwenden einer Berechnungsgruppe berechnet das allgemeine Basismaß Sales eine Summe des Gesamtumsatzes für jeden Monat. Der Benutzer möchte dann Zeitintelligenzberechnungen anwenden, um Umsatzsummen für Monat bis Datum, Quartal bis Datum, Jahr zu Datum usw. abzurufen. Ohne Berechnungsgruppen müsste der Benutzer einzelne Zeitintelligenz-Measures auswählen.

Wenn der Benutzer bei einer Berechnungsgruppe in diesem Beispiel zeitintelligenz das Element Zeitberechnung in den Filterbereich Spalten zieht, wird jedes Berechnungselement als separate Spalte angezeigt. Die Werte für jede Zeile werden aus dem Basismaß "Sales" berechnet.

Berechnungsgruppe, die in Power BI angewendet wird

Berechnungsgruppen arbeiten mit expliziten DAX-Measures. In diesem Beispiel ist Sales ein explizites Measure, das bereits im Modell erstellt wurde. Berechnungsgruppen funktionieren nicht mit impliziten DAX-Measures. Beispielsweise werden in Power BI implizite Measures erstellt, wenn ein Benutzer Spalten auf Visuals zieht, um aggregierte Werte anzuzeigen, ohne ein explizites Measure zu erstellen. Zu diesem Zeitpunkt generiert Power BI DAX für implizite Measures, die als Inline-DAX-Berechnungen geschrieben wurden, was bedeutet, dass implizite Measures nicht mit Berechnungsgruppen funktionieren können. Eine neue Modelleigenschaft, die im Tabular Object Model (TOM) sichtbar ist, wurde eingeführt: DiscourageImplicitMeasures. Derzeit muss diese Eigenschaft auf true festgelegt werden, um Berechnungsgruppen zu erstellen. Bei Festlegung auf true deaktiviert Power BI Desktop im Live Connect Modus die Erstellung impliziter Measures.

Berechnungsgruppen unterstützen auch MDX-Abfragen (Multidimensional Data Expressions). Dies bedeutet, dass Microsoft Excel-Benutzer, die tabellarische Datenmodelle mithilfe von MDX abfragen, alle Vorteile von Berechnungsgruppen in Arbeitsblatt PivotTables und Diagrammen nutzen können.

Funktionsweise

Nachdem Sie nun gesehen haben, wie Berechnungsgruppen Benutzern nutzen, sehen wir uns an, wie das gezeigte Beispiel für die Zeitintelligenz-Berechnungsgruppe erstellt wird.

Bevor wir uns mit den Details vertraut machen, stellen wir einige neue DAX-Funktionen speziell für Berechnungsgruppen vor:

SELECTEDMEASURE : Wird von Ausdrücken für Berechnungselemente verwendet, um auf das Measure zu verweisen, das sich derzeit im Kontext befindet. In diesem Beispiel das Sales-Measure.

SELECTEDMEASURENAME : Wird von Ausdrücken für Berechnungselemente verwendet, um das Measure zu bestimmen, das sich im Kontext nach Name befindet.

ISSELECTEDMEASURE : Wird von Ausdrücken für Berechnungselemente verwendet, um das Measure zu bestimmen, das sich im Kontext befindet, wird in einer Liste von Measures angegeben.

SELECTEDMEASUREFORMATSTRING : Wird von Ausdrücken für Berechnungselemente verwendet, um die Formatzeichenfolge des Measures abzurufen, das sich im Kontext befindet.

Beispiel für Zeitintelligenz

Tabellenname : Zeitintelligenz
Spaltenname – Zeitberechnung
Rangfolge – 20

Zeitintelligenz-Berechnungselemente

Current

SELECTEDMEASURE()

MTD

CALCULATE(SELECTEDMEASURE(), DATESMTD(DimDate[Date]))

QTD

CALCULATE(SELECTEDMEASURE(), DATESQTD(DimDate[Date]))

YTD

CALCULATE(SELECTEDMEASURE(), DATESYTD(DimDate[Date]))

PY

CALCULATE(SELECTEDMEASURE(), SAMEPERIODLASTYEAR(DimDate[Date]))

PY MTD

CALCULATE(
    SELECTEDMEASURE(),
    SAMEPERIODLASTYEAR(DimDate[Date]),
    'Time Intelligence'[Time Calculation] = "MTD"
)

PY QTD

CALCULATE(
    SELECTEDMEASURE(),
    SAMEPERIODLASTYEAR(DimDate[Date]),
    'Time Intelligence'[Time Calculation] = "QTD"
)

PY YTD

CALCULATE(
    SELECTEDMEASURE(),
    SAMEPERIODLASTYEAR(DimDate[Date]),
    'Time Intelligence'[Time Calculation] = "YTD"
)

YOY

SELECTEDMEASURE() -
CALCULATE(
    SELECTEDMEASURE(),
    'Time Intelligence'[Time Calculation] = "PY"
)

YOY%

DIVIDE(
    CALCULATE(
        SELECTEDMEASURE(),
        'Time Intelligence'[Time Calculation]="YOY"
    ),
    CALCULATE(
        SELECTEDMEASURE(),
        'Time Intelligence'[Time Calculation]="PY"
    )
)

Um diese Berechnungsgruppe zu testen, führen Sie eine DAX-Abfrage in SSMS oder im Open-Source-DAX Studio aus. Hinweis: YOY und YOY% werden in diesem Abfragebeispiel nicht angegeben.

Zeitintelligenzabfrage

EVALUATE
CALCULATETABLE (
    SUMMARIZECOLUMNS (
        DimDate[CalendarYear],
        DimDate[EnglishMonthName],
        "Current", CALCULATE ( [Sales], 'Time Intelligence'[Time Calculation] = "Current" ),
        "QTD",     CALCULATE ( [Sales], 'Time Intelligence'[Time Calculation] = "QTD" ),
        "YTD",     CALCULATE ( [Sales], 'Time Intelligence'[Time Calculation] = "YTD" ),
        "PY",      CALCULATE ( [Sales], 'Time Intelligence'[Time Calculation] = "PY" ),
        "PY QTD",  CALCULATE ( [Sales], 'Time Intelligence'[Time Calculation] = "PY QTD" ),
        "PY YTD",  CALCULATE ( [Sales], 'Time Intelligence'[Time Calculation] = "PY YTD" )
    ),
    DimDate[CalendarYear] IN { 2012, 2013 }
)

Time Intelligence-Abfragerückgabe

Die Rückgabetabelle zeigt Berechnungen für jedes angewendete Berechnungselement an. Beispiel: Siehe QTD für März 2012 ist die Summe von Januar, Februar und März 2012.

Rückgabe von Zeitintelligenzabfragen

Dynamische Formatzeichenfolgen

Dynamische Formatzeichenfolgen mit Berechnungsgruppen ermöglichen die bedingte Anwendung von Formatzeichenfolgen auf Measures, ohne sie zum Zurückgeben von Zeichenfolgen zu zwingen.

Tabellarische Modelle unterstützen die dynamische Formatierung von Measures mithilfe der FORMAT-Funktion von DAX. Die FORMAT-Funktion hat jedoch den Nachteil, dass eine Zeichenfolge zurückgegeben wird, sodass Measures, die andernfalls numerisch wären, auch als Zeichenfolge zurückgegeben werden. Dies kann einige Einschränkungen aufweisen, z. B. nicht mit den meisten Power BI-Visuals abhängig von numerischen Werten, z. B. Diagrammen.

In Power BI ermöglichen dynamische Formatzeichenfolgen für Measures auch die bedingte Anwendung von Formatzeichenfolgen auf ein bestimmtes Measure, ohne dass diese gezwungen werden, eine Zeichenfolge zurückzugeben und ohne die Verwendung von Berechnungsgruppen. Weitere Informationen finden Sie unter Dynamische Formatzeichenfolgen für Measures.

Dynamische Formatzeichenfolgen für Zeitintelligenz

Wenn wir uns das oben gezeigte Zeitintelligenzbeispiel ansehen, sollten alle Berechnungselemente mit Ausnahme von YOY% das Format des aktuellen Measures im Kontext verwenden. Beispielsweise sollte der für das Basismaß Sales berechnete YTD eine Währung sein. Wenn dies eine Berechnungsgruppe für etwas wie ein Orders-Basismaß wäre, wäre das Format numerisch. YOY% sollte jedoch unabhängig vom Format des Basismaßes ein Prozentsatz sein.

Für YOY% können wir die Formatzeichenfolge überschreiben, indem wir die Eigenschaft formatzeichenfolgenausdruck auf 0,00%;-0,00% festlegen; 0,00%. Weitere Informationen zu Formatzeichenfolgenausdruckeigenschaften finden Sie unter MDX-Zelleneigenschaften – FORMAT STRING Contents.

In diesem Matrixvisual in Power BI sehen Sie, dass Sales Current/YOY und Orders Current/YOY ihre jeweiligen Basismaßformatzeichenfolgen beibehalten. Sales YOY% und Orders YOY% setzt jedoch die Formatzeichenfolge außer Kraft, um das Prozentformat zu verwenden.

Zeitintelligenz im Matrixvisual

Dynamische Formatzeichenfolgen für die Währungsumrechnung

Dynamische Formatzeichenfolgen ermöglichen eine einfache Währungsumrechnung. Betrachten Sie das folgende Adventure Works-Datenmodell. Es wird für die 1:n-Währungsumrechnung modelliert, wie durch Konvertierungstypen definiert.

Wechselkurs im tabellarischen Modell

Der Tabelle DimCurrency wird eine FormatString-Spalte hinzugefügt und mit Formatzeichenfolgen für die jeweiligen Währungen aufgefüllt.

Zeichenfolgenspalte formatieren

In diesem Beispiel wird die folgende Berechnungsgruppe als definiert:

Währungsumrechnungsbeispiel

Tabellenname – Währungsumrechnung
Spaltenname – Konvertierungsberechnung
Rangfolge – 5

Berechnungselemente für Währungsumrechnung

Keine Konvertierung

SELECTEDMEASURE()

Umgerechnete Währung

IF(
    //Check one currency in context & not US Dollar, which is the pivot currency:
    SELECTEDVALUE( DimCurrency[CurrencyName], "US Dollar" ) = "US Dollar",
    SELECTEDMEASURE(),
    SUMX(
        VALUES(DimDate[Date]),
        CALCULATE( DIVIDE( SELECTEDMEASURE(), MAX(FactCurrencyRate[EndOfDayRate]) ) )
    )
)

Zeichenfolgenausdruck formatieren

SELECTEDVALUE(
    DimCurrency[FormatString],
    SELECTEDMEASUREFORMATSTRING()
)

Hinweis

Auswahlausdrücke für Berechnungsgruppen befinden sich derzeit in der Vorschauphase und können verwendet werden, um die automatische Währungsumrechnung für Berechnungsgruppen zu implementieren, wodurch keine zwei separaten Berechnungselemente erforderlich sind.

Der Formatzeichenfolgenausdruck muss eine skalare Zeichenfolge zurückgeben. Es verwendet die neue SELECTEDMEASUREFORMATSTRING-Funktion, um die Zeichenfolge im Basismaßformat zu rückgängig machen, wenn mehrere Währungen im Filterkontext vorhanden sind.

Die folgende Animation zeigt die Währungsumrechnung im dynamischen Format des Sales-Measures in einem Bericht.

Dynamische Formatzeichenfolge für Währungsumrechnung angewendet

Auswahlausdrücke (Vorschau)

Auswahlausdrücke sind optionale Eigenschaften, die für eine Berechnungsgruppe definiert sind. Es gibt zwei Arten von Auswahlausdrücken:

  • multipleOrEmptySelectionExpression. Dieser Auswahlausdruck wird angewendet, wenn mehrere Berechnungselemente ausgewählt wurden, ein nicht vorhandenes Berechnungselement ausgewählt wurde oder wenn eine in Konflikt stehende Auswahl getroffen wurde.
  • noSelectionExpression. Dieser Auswahlausdruck wird angewendet, wenn die Berechnungsgruppe nicht gefiltert wird.

Beide Auswahlausdrücke verfügen auch über einen dynamischen Formatzeichenfolgenausdruck formatStringDefinition.

Zusammenfassend kann für eine Berechnungsgruppe Folgendes definiert werden:

...
"calculationGroup": {
  "multipleOrEmptySelectionExpression": {
    "expression": "",
    "formatStringDefinition": {...}
  },
  "noSelectionExpression": {
    "expression": "",
    "formatStringDefinition": {...}
  }
...
}

Hinweis

Wenn diese Ausdrücke angegeben werden, werden sie nur für die genannten spezifischen Situationen angewendet. Auswahlen für ein einzelnes Berechnungselement sind von diesen Ausdrücken nicht betroffen.

Hier ist eine Übersicht über diese Ausdrücke und deren Standardverhalten, falls nicht angegeben:

Typ der Auswahl Auswahlausdruck nicht definiert (Standard) Auswahlausdruck definiert
Einzelauswahl Die Auswahl wird angewendet. Die Auswahl wird angewendet.
Mehrfachauswahl Berechnungsgruppe ist nicht gefiltert Zurückgeben des Ergebnisses der Auswertung von multipleOrEmptySelectionExpression
Leere Auswahl Berechnungsgruppe ist nicht gefiltert Zurückgeben des Ergebnisses der Auswertung von multipleOrEmptySelectionExpression
Keine Auswahl Berechnungsgruppe ist nicht gefiltert Zurückgeben des Ergebnisses der Auswertung von noSelectionExpression

Mehrfache oder leere Auswahl

Wenn mehrere Auswahlen für dieselbe Berechnungsgruppe vorgenommen werden, wertet die Berechnungsgruppe das Ergebnis von multipleOrEmptySelectionExpression aus und gibt es zurück, sofern definiert. Wenn dieser Ausdruck nicht definiert wurde, gibt die Berechnungsgruppe das folgende Ergebnis zurück:

SELECTEDMEASURE()

Als Beispiel sehen wir uns eine Berechnungsgruppe namens MyCalcGroup an, deren multipleOrEmptySelectionExpression wie folgt konfiguriert ist:

IF (
ISFILTERED ( 'MyCalcGroup' ),
    "Filters: " 
         & CONCATENATEX ( 
  	            FILTERS ( 'MyCalcGroup'[Name] ),
            'MyCalcGroup'[Name], 
            ", "
     	   )
)

Stellen Sie sich nun die folgende Auswahl für die Berechnungsgruppe vor:

EVALUATE
{
    CALCULATE (
        [MyMeasure],
        'MyCalcGroup'[Name] = "item1" || 'MyCalcGroup'[Name] = "item2"
    )
}

Hier wählen wir zwei Elemente in der Berechnungsgruppe aus, "item1" und "item2". Dies ist eine Mehrfachauswahl, und daher wird multipleOrEmptySelectionExpression ausgewertet und gibt das folgende Ergebnis zurück: "Filters: item1, item2".

Wählen Sie als Nächstes die folgende Auswahl für die Berechnungsgruppe aus:

EVALUATE
{
    CALCULATE (
        [MyMeasure],
        'MyCalcGroup'[Name] = "item4" -- item4 does not exists
    )
}

Dies ist ein Beispiel für eine leere Auswahl, da "Item4" in dieser Berechnungsgruppe nicht vorhanden ist. Daher wird multipleOrEmptySelectionExpression ausgewertet und gibt das folgende Ergebnis zurück: "Filters: ".

Keine Auswahl

NoSelectionExpression wird auf eine Berechnungsgruppe angewendet, wenn die Berechnungsgruppe nicht gefiltert wurde. Dies wird hauptsächlich verwendet, um Standardaktionen auszuführen, ohne dass der Benutzer Maßnahmen ergreifen muss, und bietet dem Benutzer gleichzeitig flexibilität, die Standardaktion zu überschreiben. Betrachten wir beispielsweise die automatische Währungsumrechnung mit US-Dollar als zentrale Pivotwährung.

Wir können eine Berechnungsgruppe mit dem folgenden noSelectionExpression einrichten:

IF (
    //Check one currency in context & not US Dollar, which is the pivot currency:
    SELECTEDVALUE (
        DimCurrency[CurrencyName],
        "US Dollar"
    ) = "US Dollar",
    SELECTEDMEASURE (),
    SUMX (
        VALUES ( DimDate[DateKey] ),
        CALCULATE (
            DIVIDE ( SELECTEDMEASURE (), MAX ( FactCurrencyRate[EndOfDayRate] ) )
        )
    )
)

Wir legen auch eine formatStringDefinition für diesen Ausdruck fest:

SELECTEDVALUE(
  DimCurrency[FormatString],
  SELECTEDMEASUREFORMATSTRING()
)

Wenn nun keine Währung ausgewählt wird, werden alle Währungen bei Bedarf automatisch in die Pivotwährung (US-Dollar) umgerechnet. Darüber hinaus können Sie immer noch eine andere Währung auswählen, die in diese Währung konvertiert werden soll, ohne dass Sie die Berechnungselemente wechseln müssen, wie Sie es ohne noSelectionExpression tun müssten.

Rangfolge

Rangfolge ist eine Eigenschaft, die für eine Berechnungsgruppe definiert ist. Es gibt die Reihenfolge an, in der die Berechnungsgruppen mit dem zugrunde liegenden Measure kombiniert werden, wenn SELECTEDMEASURE() im Berechnungselement verwendet wird.

Rangfolgenbeispiel

Sehen wir uns ein einfaches Beispiel an. Dieses Modell verfügt über ein Measure mit einem angegebenen Wert von 10 und zwei Berechnungsgruppen mit jeweils einem einzelnen Berechnungselement. Wir wenden die Berechnungselemente beider Berechnungsgruppen auf das Measure an. So richten wir sie ein:

'Measure group'[Measure] = 10

Die erste Berechnungsgruppe ist 'Calc Group 1 (Precedence 100)' , und das Berechnungselement lautet 'Calc item (Plus 2)':

'Calc Group 1 (Precedence 100)'[Calc item (Plus 2)] = SELECTEDMEASURE() + 2

Die zweite Berechnungsgruppe ist 'Calc Group 2 (Precedence 200)' , und das Berechnungselement lautet 'Calc item (Times 2)':

'Calc Group 2 (Precedence 200)'[Calc item (Times 2)] = SELECTEDMEASURE() * 2

Sie können sehen, dass die Berechnungsgruppe 1 den Rangfolgewert 100 hat, und die Berechnungsgruppe 2 hat den Rangfolgewert 200.

Mithilfe von SQL Server Management Studio (SSMS) oder einem externen Tool mit XMLA-Lese-/Schreibfunktionen wie dem tabellarischen Open-Source-Editor können Sie XMLA-Skripts verwenden, um Berechnungsgruppen zu erstellen und die Rangfolgewerte festzulegen. Hier fügen wir hinzu "Calc group 1 (Precedence 100)":

{
  "createOrReplace": {
    "object": {
      "database": "CHANGE TO YOUR DATASET NAME",
      "table": "Calc group 1 (Precedence 100)"
    },
    "table": {
      "name": "Calc group 1 (Precedence 100)",
      "calculationGroup": {
        "precedence": 100,
        "calculationItems": [
          {
            "name": "Calc item (Plus 2)",
            "expression": "SELECTEDMEASURE() + 2",
          }
        ]
      },
      "columns": [
        {
          "name": "Calc group 1 (Precedence 100)",
          "dataType": "string",
          "sourceColumn": "Name",
          "sortByColumn": "Ordinal",
          "summarizeBy": "none",
          "annotations": [
            {
              "name": "SummarizationSetBy",
              "value": "Automatic"
            }
          ]
        },
        {
          "name": "Ordinal",
          "dataType": "int64",
          "isHidden": true,
          "sourceColumn": "Ordinal",
          "summarizeBy": "sum",
          "annotations": [
            {
              "name": "SummarizationSetBy",
              "value": "Automatic"
            }
          ]
        }
      ],
      "partitions": [
        {
          "name": "Partition",
          "mode": "import",
          "source": {
            "type": "calculationGroup"
          }
        }
      ]
    }
  }
}

Und dieses Skript fügt hinzu "Calc group 2 (Precedence 200)":

{
  "createOrReplace": {
    "object": {
      "database": "CHANGE TO YOUR DATASET NAME",
      "table": "Calc group 2 (Precedence 200)"
    },
    "table": {
      "name": "Calc group 2 (Precedence 200)",
      "calculationGroup": {
        "precedence": 200,
        "calculationItems": [
          {
            "name": "Calc item (Times 2)",
            "expression": "SELECTEDMEASURE() * 2"
          }
        ]
      },
      "columns": [
        {
          "name": "Calc group 2 (Precedence 200)",
          "dataType": "string",
          "sourceColumn": "Name",
          "sortByColumn": "Ordinal",
          "summarizeBy": "none",
          "annotations": [
            {
              "name": "SummarizationSetBy",
              "value": "Automatic"
            }
          ]
        },
        {
          "name": "Ordinal",
          "dataType": "int64",
          "isHidden": true,
          "sourceColumn": "Ordinal",
          "summarizeBy": "sum",
          "annotations": [
            {
              "name": "SummarizationSetBy",
              "value": "Automatic"
            }
          ]
        }
      ],
      "partitions": [
        {
          "name": "Partition",
          "mode": "import",
          "source": {
            "type": "calculationGroup"
          }
        }
      ]
    }
  }
}

In Power BI Desktop verfügen wir über ein Karte Visual, das das Measure und einen Slicer für jede der Berechnungsgruppen in der Berichtsansicht zeigt:

Separate Ausdrücke der Measuregruppe.

Wenn beide Slicer ausgewählt sind, müssen die DAX-Ausdrücke kombiniert werden. Um dies zu tun, beginnen wir mit dem höchsten Rangberechnungselement, 200, und ersetzen dann das SELECTEDMEASURE()-Argument durch das nächsthöhere 100.

Unser DAX-Ausdruck mit der höchsten Rangfolge für die Berechnung des Elements lautet also:

SELECTEDMEASURE() * 2 

Und unser DAX-Ausdruck für die Berechnung der zweithöchsten Rangfolge ist:

SELECTEDMEASURE() + 2 

Jetzt werden sie kombiniert, indem der SELECTEDMEASURE()-Teil des Berechnungselements der höchsten Rangfolge wie folgt durch das nächsthöhere Rangberechnungselement ersetzt wird:

( SELECTEDMEASURE() + 2 ) * 2

Wenn dann weitere Berechnungselemente vorhanden sind, fahren wir fort, bis wir zum zugrunde liegenden Measure gelangen. In diesem Modell gibt es nur zwei Berechnungsgruppen. Daher ersetzen wir jetzt SELECTEDMEASURE() wie folgt durch das Measure selbst:

( ( [Measure] ) + 2 ) * 2

Wie unser Measure = 10ist dies identisch mit:

( ( 10 ) + 2 ) * 2

Wenn keine SELECTEDMEASURE()-Argumente mehr vorhanden sind, wird der kombinierte DAX-Ausdruck ausgewertet:

( ( 10 ) + 2 ) * 2 = 24

Wenn in Power BI Desktop beide Berechnungsgruppen mit einem Datenschnitt angewendet werden, sieht die Measureausgabe wie folgt aus:

Kombinierte Ausdrücke für Measuregruppen.

Beachten Sie jedoch, dass die Kombination so geschachtelt ist, dass die Ausgabe nicht 10 + 2 * 2 = 14 ist, wie Sie hier sehen:

Measuregruppengeschachtelte Ausdrücke.

Bei einfachen Transformationen erfolgt die Auswertung von niedrigerer zu höherer Rangfolge. Beispiel: 10 hat 2 hinzugefügt, dann wird es mit 2 multipliziert. In DAX gibt es Funktionen wie CALCULATE, die Filter oder Kontextänderungen auf innere Ausdrücke anwenden. In diesem Fall ändert die höhere Rangfolge einen niedrigeren Rangfolgenausdruck.

Die Rangfolge bestimmt auch, welche dynamische Formatzeichenfolge für jedes Measure auf den kombinierten DAX-Ausdruck angewendet wird. Die dynamische Formatzeichenfolge für die Berechnungsgruppe mit der höchsten Rangfolge ist die einzige angewendete. Wenn ein Measure selbst über eine dynamische Formatzeichenfolge verfügt, wird es als niedrigere Rangfolge für jede Berechnungsgruppe im Modell betrachtet.

Rangfolge mit Durchschnittswerten (Beispiel)

Sehen wir uns ein weiteres Beispiel an, das dasselbe Modell verwendet, wie im oben in diesem Artikel beschriebenen Zeitintelligenzbeispiel gezeigt. Dieses Mal fügen wir aber auch eine Berechnungsgruppe Mittelwerte hinzu. Die Berechnungsgruppe Mittelwerte enthält Durchschnittsberechnungen, die unabhängig von der herkömmlichen Zeitintelligenz sind, da sie den Datumsfilterkontext nicht ändern, sie wenden lediglich Durchschnittsberechnungen darin an.

In diesem Beispiel wird eine tägliche Durchschnittsberechnung definiert. Berechnungen wie durchschnittliche Barrel Öl pro Tag sind in Öl- und Gasanwendungen üblich. Weitere gängige Geschäftsbeispiele sind der Durchschnittswert des Ladenumsatzes im Einzelhandel.

Während solche Berechnungen unabhängig von Zeitintelligenzberechnungen berechnet werden, kann es durchaus erforderlich sein, sie zu kombinieren. Ein Benutzer möchte beispielsweise Barrels Öl pro Tag YTD anzeigen, um die tägliche Ölrate vom Anfang des Jahres bis zum aktuellen Datum anzuzeigen. In diesem Szenario sollte die Rangfolge für Berechnungselemente festgelegt werden.

Unsere Annahmen lauten:

Der Tabellenname ist Mittelwerte.
Spaltenname ist Durchschnittsberechnung.
Rangfolge ist 10.

Berechnungselemente für Mittelwerte

Kein Durchschnitt

SELECTEDMEASURE()

Täglicher Durchschnitt

DIVIDE(SELECTEDMEASURE(), COUNTROWS(DimDate))

Hier sehen Sie ein Beispiel für eine DAX-Abfrage und eine Rückgabetabelle:

Averages-Abfrage

EVALUATE
    CALCULATETABLE (
        SUMMARIZECOLUMNS (
        DimDate[CalendarYear],
        DimDate[EnglishMonthName],
        "Sales", CALCULATE (
            [Sales],
            'Time Intelligence'[Time Calculation] = "Current",
            'Averages'[Average Calculation] = "No Average"
        ),
        "YTD", CALCULATE (
            [Sales],
            'Time Intelligence'[Time Calculation] = "YTD",
            'Averages'[Average Calculation] = "No Average"
        ),
        "Daily Average", CALCULATE (
            [Sales],
            'Time Intelligence'[Time Calculation] = "Current",
            'Averages'[Average Calculation] = "Daily Average"
        ),
        "YTD Daily Average", CALCULATE (
            [Sales],
            'Time Intelligence'[Time Calculation] = "YTD",
            'Averages'[Average Calculation] = "Daily Average"
        )
    ),
    DimDate[CalendarYear] = 2012
)

Abfragerückgabe "Averages"

Abfragerückgabe

Die folgende Tabelle zeigt, wie die Werte vom März 2012 berechnet werden.

Spaltenname Berechnung
YTD Summe der Verkäufe für Jan, Feb, Mär 2012
= 495.364 + 506.994 + 373.483
Tagesdurchschnitt Umsatz für März 2012 dividiert durch die Anzahl der Tage im März
= 373.483 / 31
YTD-Tagesdurchschnitt YTD für März 2012 geteilt durch Die Anzahl der Tage in Jan, Feb und Mar
= 1.375.841 / (31 + 29 + 31)

Hier sehen Sie die Definition des YTD-Berechnungselements, das mit der Rangfolge 20 angewendet wird.

CALCULATE(SELECTEDMEASURE(), DATESYTD(DimDate[Date]))

Dies ist der Tagesdurchschnitt, der mit einer Rangfolge von 10 angewendet wird.

DIVIDE(SELECTEDMEASURE(), COUNTROWS(DimDate))

Da die Rangfolge der Zeitintelligenz-Berechnungsgruppe höher als die der Berechnungsgruppe Durchschnitte ist, wird sie so breit wie möglich angewendet. Die YTD Daily Average-Berechnung wendet YTD sowohl auf den Zähler als auch auf den Nenner (Anzahl der Tage) der täglichen Durchschnittsberechnung an.

Dies entspricht dem folgenden Ausdruck:

CALCULATE(DIVIDE(SELECTEDMEASURE(), COUNTROWS(DimDate)), DATESYTD(DimDate[Date]))

Nicht dieser Ausdruck:

DIVIDE(CALCULATE(SELECTEDMEASURE(), DATESYTD(DimDate[Date])), COUNTROWS(DimDate)))

Seitliche Rekursion

Im obigen Zeitintelligenzbeispiel verweisen einige der Berechnungselemente auf andere in derselben Berechnungsgruppe. Dies wird als seitliche Rekursion bezeichnet. Beispielsweise verweist YOY% sowohl auf YOY als auch auf PY.

DIVIDE(
    CALCULATE(
        SELECTEDMEASURE(),
        'Time Intelligence'[Time Calculation]="YOY"
    ),
    CALCULATE(
        SELECTEDMEASURE(),
        'Time Intelligence'[Time Calculation]="PY"
    )
)

In diesem Fall werden beide Ausdrücke getrennt ausgewertet, da sie unterschiedliche Berechnungsanweisungen verwenden. Andere Rekursionstypen werden nicht unterstützt.

Einzelnes Berechnungselement im Filterkontext

In unserem Time Intelligence-Beispiel weist das PY YTD-Berechnungselement einen einzelnen Berechnungsausdruck auf:

CALCULATE(
    SELECTEDMEASURE(),
    SAMEPERIODLASTYEAR(DimDate[Date]),
    'Time Intelligence'[Time Calculation] = "YTD"
)

Das YTD-Argument für die CALCULATE()-Funktion überschreibt den Filterkontext, um die bereits im YTD-Berechnungselement definierte Logik wiederzuverwenden. Es ist nicht möglich, py und YTD in einer einzigen Auswertung anzuwenden. Berechnungsgruppen werden nur angewendet , wenn sich ein einzelnes Berechnungselement aus der Berechnungsgruppe im Filterkontext befindet.

Sortieren

Wenn eine Spalte aus einer Berechnungsgruppe in einem Bericht platziert wird, werden Berechnungselemente standardmäßig alphabetisch nach Name sortiert. Die Reihenfolge, in der Berechnungselemente in einem Bericht angezeigt werden, können durch Angeben der Ordinaleigenschaft geändert werden. Das Angeben der Berechnungselementreihenfolge mit der Ordinal-Eigenschaft ändert nicht die Rangfolge, die Reihenfolge, in der Berechnungselemente ausgewertet werden. Es ändert auch nicht die Reihenfolge, in der Berechnungselemente in Tabular Model Explorer angezeigt werden.

Um die Ordnungseigenschaft für Berechnungselemente anzugeben, müssen Sie der Berechnungsgruppe eine zweite Spalte hinzufügen. Im Gegensatz zur Standardspalte, in der Datentyp Text ist, weist eine zweite Spalte, die zum Sortieren von Berechnungselementen verwendet wird, den Datentyp Ganze Zahl auf. Der einzige Zweck dieser Spalte besteht darin, die numerische Reihenfolge anzugeben, in der Berechnungselemente in der Berechnungsgruppe angezeigt werden. Da diese Spalte keinen Wert in einem Bericht enthält, ist es am besten, die Hidden-Eigenschaft auf True festzulegen.

Spalte für die Reihenfolge

Nachdem der Berechnungsgruppe eine zweite Spalte hinzugefügt wurde, können Sie den Ordinal-Eigenschaftswert für Berechnungselemente angeben, die Sie bestellen möchten.

Ordnungszahleigenschaft

Weitere Informationen finden Sie unter So ordnen Sie Berechnungselemente an.

Erstellen einer Berechnungsgruppe

Berechnungsgruppen werden in Visual Studio mit Analysis Services Projects VSIX Update 2.9.2 und höher unterstützt. Berechnungsgruppen können auch mithilfe von TMSL (Tabular Model Scripting Language) oder der Open Source Tabular Editor erstellt werden.

So erstellen Sie eine Berechnungsgruppe mit Visual Studio

  1. Klicken Sie in tabellarischem Modell Explorer mit der rechten Maustaste auf Berechnungsgruppen, und klicken Sie dann auf Neue Berechnungsgruppe. Standardmäßig verfügt eine neue Berechnungsgruppe über eine einzelne Spalte und ein einzelnes Berechnungselement.

  2. Verwenden Sie Eigenschaften , um den Namen zu ändern und eine Beschreibung für die Berechnungsgruppe, Spalte und das Standardberechnungselement einzugeben.

  3. Um einen DAX-Formelausdruck für das Standardberechnungselement einzugeben, klicken Sie mit der rechten Maustaste, und klicken Sie dann auf Formel bearbeiten, um DAX-Editor zu öffnen. Geben Sie einen gültigen Ausdruck ein.

  4. Um weitere Berechnungselemente hinzuzufügen, klicken Sie mit der rechten Maustaste auf Berechnungselemente, und klicken Sie dann auf Neues Berechnungselement.

So ordnen Sie Berechnungselemente an

  1. Klicken Sie unter Tabular Model Explorer mit der rechten Maustaste auf eine Berechnungsgruppe, und klicken Sie dann auf Spalte hinzufügen.

  2. Nennen Sie die Spalte Ordinal (oder ähnlich), geben Sie eine Beschreibung ein, und legen Sie dann die Hidden-Eigenschaft auf True fest.

  3. Legen Sie für jedes Berechnungselement, das Sie bestellen möchten, die Ordinal-Eigenschaft auf eine positive Zahl fest. Jede Zahl ist sequenziell, z. B. wird zuerst ein Berechnungselement mit der Ordinaleigenschaft 1 angezeigt, eine Eigenschaft von 2 wird an zweiter Stelle angezeigt usw. Berechnungselemente mit der Standardeinstellung -1 sind nicht in der Reihenfolge enthalten, sondern werden vor geordneten Elementen in einem Bericht angezeigt.

Einschränkungen

Für Berechnungsgruppentabellen definierte Sicherheit auf Objektebene (Object Level Security, OLS) wird nicht unterstützt. OLS kann jedoch für andere Tabellen im selben Modell definiert werden. Wenn ein Berechnungselement auf ein OLS-gesichertes Objekt verweist, wird ein generischer Fehler zurückgegeben.

Die Sicherheit auf Zeilenebene (Row Level Security , RLS) wird nicht unterstützt. Definieren Sie RLS für Tabellen im selben Modell, aber nicht für Berechnungsgruppen selbst (direkt oder indirekt).

Für Berechnungsgruppen werden keine Detailzeilenausdrücke unterstützt.

Smart Narrative Visuals in Power BI werden bei Berechnungsgruppen nicht unterstützt.

Implizite Spaltenaggregationen in Power BI werden für Modelle mit Berechnungsgruppen nicht unterstützt. Wenn die DiscourageImplicitMeasures-Eigenschaft auf false (Standard) festgelegt ist, werden derzeit Aggregationsoptionen angezeigt, die jedoch nicht angewendet werden können. Wenn DiscourageImplicitMeasures auf true festgelegt ist, werden keine Aggregationsoptionen angezeigt.

Beim Erstellen von Power BI-Berichten mit LiveConnection werden dynamische Formatzeichenfolgen nicht auf Measures auf Berichtsebene angewendet.

Weitere Informationen

DAX in tabellarischen Modellen
DAX-Referenz