Verwenden von Variablen zur Verbesserung Ihrer DAX-Formeln

Das Schreiben und Debuggen von DAX-Berechnungen kann für Datenmodellierer eine große Herausforderung darstellen. Komplexe Berechnungsanforderungen beinhalten häufig das Schreiben zusammengesetzter oder komplexer Ausdrücke. Zusammengesetzte Ausdrücke können die Verwendung vieler geschachtelter Funktionen und möglicherweise die Wiederverwendung von Ausdruckslogik einschließen.

Durch die Verwendung von Variablen in DAX-Formeln können Sie komplexere und effizientere Berechnungen anfertigen. Variablen können die Leistung, Zuverlässigkeit und Lesbarkeit verbessern und die Komplexität verringern.

In diesem Artikel werden anhand der Verwendung eines Beispielmeasures für das YoY-Umsatzwachstum (Year-over-Year) die drei wichtigsten Vorteile veranschaulicht. (Die Formel für das Umsatzwachstum im Vergleich zum Vorjahr lautet folgendermaßen: Umsatz im aktuellen Zeitraum minus Umsatz im selben Zeitraum im vergangenen Jahr, geteilt durch Umsatz im selben Zeitraum im vergangenen Jahr.)

Beginnen wir mit der folgenden Measuredefinition.

Sales YoY Growth % =
DIVIDE(
    ([Sales] - CALCULATE([Sales], PARALLELPERIOD('Date'[Date], -12, MONTH))),
    CALCULATE([Sales], PARALLELPERIOD('Date'[Date], -12, MONTH))
)

Das Measure erzeugt das richtige Ergebnis, aber sehen wir uns jetzt an, wie es weiter verbessert werden kann.

Verbessern der Leistung

Beachten Sie, dass in der Formel der Ausdruck für die Berechnung für den gleichen Zeitraum im vergangenen Jahr wiederholt wird. Diese Formel ist ineffizient, da Power BI den gleichen Ausdruck zweimal auswerten muss. Die Measuredefinition lässt sich mithilfe einer Variablen, VAR, effizienter gestalten.

Die folgende Measuredefinition weisen eine Verbesserung auf. Es wird ein Ausdruck verwendet, um einer Variable namens SalesPriorYear das Ergebnis für „same period last year“ (Vorjahreszeitraum) zuzuweisen. Die Variable wird dann zweimal im Ausdruck „RETURN“ (ZURÜCKGEBEN) verwendet.

Sales YoY Growth % =
VAR SalesPriorYear =
    CALCULATE([Sales], PARALLELPERIOD('Date'[Date], -12, MONTH))
RETURN
    DIVIDE(([Sales] - SalesPriorYear), SalesPriorYear)

Das Measure erzeugt weiterhin das korrekte Ergebnis in etwa der Hälfte der Abfragezeit.

Verbessern der Lesbarkeit

Beachten Sie, dass der Ausdruck „RETURN“ (ZURÜCKGEBEN) durch die Auswahl des Variablennamens in der vorherigen Measuredefinition leichter zu verstehen ist. Der Ausdruck ist kurz und selbsterklärend.

Vereinfachen des Debuggens

Variablen können auch beim Debuggen einer Formel helfen. Schreiben Sie zum Testen eines einer Variable zugeordneten Ausdrucks vorübergehend den Ausdruck „RETURN“ (ZURÜCKGEBEN) um, um die Variable auszugeben.

Die folgende Measuredefinition gibt nur die Variable SalesPriorYear zurück. Beachten Sie, wie der beabsichtigte Ausdruck „RETURN“ (ZURÜCKGEBEN) auskommentiert wird. Diese Technik ermöglicht es Ihnen, den Ausdruck nach Abschluss des Debuggens problemlos wiederherzustellen.

Sales YoY Growth % =
VAR SalesPriorYear =
    CALCULATE([Sales], PARALLELPERIOD('Date'[Date], -12, MONTH))
RETURN
    --DIVIDE(([Sales] - SalesPriorYear), SalesPriorYear)
    SalesPriorYear

Reduzieren der Komplexität

In früheren Versionen von DAX wurden Variablen noch nicht unterstützt. Komplexe Ausdrücke, die neue Filter eingeführt haben, mussten die DAX-Funktionen EARLIER oder EARLIEST verwenden, um auf äußere Filterkontexte zu verweisen. Leider waren diese Funktionen laut Datenmodellierern schwer zu verstehen und zu verwenden.

Variablen werden immer außerhalb der Filter ausgewertet, die der Ausdruck „RETURN“ (ZURÜCKGEBEN) anwendet. Wenn Sie eine Variable innerhalb eines geänderten Filterkontexts verwenden, wird daher das gleiche Ergebnis wie bei der „EARLIEST“-Funktion erzielt. Daher kann die Verwendung der Funktionen „EARLIER“ oder „EARLIEST“ vermieden werden. Dies bedeutet, dass Sie jetzt Formeln schreiben können, die weniger komplex sind und leichter zu verstehen sind.

Beachten Sie die folgende Definition einer berechneten Spalte, die der Tabelle Subcategory hinzugefügt wurde. Sie wertet, basierend auf den Werten in der Spalte Subcategory Sales (Umsatz Unterkategorie), einen Rang für jede Produktunterkategorie aus.

Subcategory Sales Rank =
COUNTROWS(
    FILTER(
        Subcategory,
        EARLIER(Subcategory[Subcategory Sales]) < Subcategory[Subcategory Sales]
    )
) + 1

Die Funktion „EARLIER“ wird verwendet, um auf den Wert in der Spalte Subcategory Sales (Umsatz Unterkategorie) im aktuellen Zeilenkontext zu verweisen.

Die Definition von berechneten Spalten kann mithilfe einer Variablen anstelle der „EARLIER“-Funktion verbessert werden. Die Variable CurrentSubcategorySales speichert den Wert der Spalte Subcategory Sales (Umsatz Unterkategorie) im aktuellen Zeilenkontext, und der Ausdruck „RETURN“ (ZURÜCKGEBEN) verwendet ihn in einem geänderten Filterkontext.

Subcategory Sales Rank =
VAR CurrentSubcategorySales = Subcategory[Subcategory Sales]
RETURN
    COUNTROWS(
        FILTER(
            Subcategory,
            CurrentSubcategorySales < Subcategory[Subcategory Sales]
        )
    ) + 1