Freigeben über


Verwenden Sie Variablen, um Ihre DAX-Formeln zu verbessern

Als Datenmodellierer kann es schwierig sein, einige DAX Berechnungen zu schreiben und zu debuggen. Es ist üblich, dass komplexe Berechnungsanforderungen häufig das Schreiben von zusammengesetzten oder komplexen Ausdrücken umfassen. Zusammengesetzte Ausdrücke können die Verwendung vieler geschachtelter Funktionen und möglicherweise die Wiederverwendung von Ausdruckslogik umfassen.

Wenn Sie Variablen in Ihren DAX Formeln verwenden, können Sie komplexere und effizientere Berechnungen schreiben. Variablen können die Leistung, Zuverlässigkeit, Lesbarkeit und Komplexität verbessern.

In diesem Artikel demonstrieren wir die ersten drei Vorteile anhand einer Beispielmaßnahme für das Jahr-zu-Jahr-Umsatzwachstum (YoY). Die Formel für das YoY-Umsatzwachstum ist der Umsatz des Zeitraums, abzüglich des Umsatzes für den gleichen Zeitraum im letzten Jahr, dividiert durch den Umsatz für den gleichen Zeitraum im letzten Jahr.

Beginnen wir mit der folgenden Maßnahmendefinition.

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

Die Maßnahme erzeugt das richtige Ergebnis, doch schauen wir jetzt, wie sie verbessert werden kann.

Verbessern der Leistung

Beachten Sie, dass die Formel den Ausdruck wiederholt, der "derselbe Zeitraum im letzten Jahr" berechnet. Diese Formel ist ineffizient, da Power BI denselben Ausdruck zweimal auswerten muss. Die Maßdefinition kann mithilfe einer Variablen VAReffizienter gestaltet werden.

Die folgende Maßnahmendefinition stellt eine Verbesserung dar. Es verwendet einen Ausdruck, um das Ergebnis "der gleichen Periode im letzten Jahr" einer Variablen namens SalesPriorYearzuzuweisen. Die Variable wird dann zweimal im RETURN-Ausdruck verwendet.

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

Die Maßnahme liefert weiterhin das richtige Ergebnis und tut dies etwa in der Hälfte der Abfragezeit.

Verbessern der Lesbarkeit

Beachten Sie in der vorherigen Measuredefinition, wie die Auswahl des Variablennamens den RETURN-Ausdruck einfacher verstehen lässt. Der Ausdruck ist kurz und selbst beschreibend.

Debugging vereinfachen

Variablen können Sie auch beim Debuggen einer Formel unterstützen. Um einen Ausdruck zu testen, der einer Variablen zugewiesen ist, schreiben Sie den RETURN-Ausdruck vorübergehend um, um die Variable auszugeben.

Die folgende Messdefinition gibt nur die Variable SalesPriorYear zurück. Beachten Sie, wie der beabsichtigte Ausdruck „RETURN“ (ZURÜCKGEBEN) auskommentiert wird. Mit dieser Technik können Sie sie nach Abschluss des Debuggings ganz einfach wiederherstellen.

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

Verringern der Komplexität

In früheren Versionen von DAXwurden Variablen noch nicht unterstützt. Komplexe Ausdrücke, die neue Filterkontexte eingeführt haben, mussten die EARLIER- oder EARLIESTDAX-Funktionen verwenden, um auf äußere Filterkontexte zu verweisen. Leider fanden Datenmodellierer diese Funktionen schwer zu verstehen und zu verwenden.

Variablen werden immer außerhalb der Filter ausgewertet, die ihr RETURN-Ausdruck anwendet. Aus diesem Grund wird bei Verwendung einer Variablen innerhalb eines geänderten Filterkontexts dasselbe Ergebnis wie die EARLIEST-Funktion erzielt. Die Verwendung der funktionen EARLIER oder EARLIEST kann daher vermieden werden. Dies bedeutet, dass Sie jetzt Formeln schreiben können, die weniger komplex sind und einfacher zu verstehen sind.

Betrachten Sie die folgende berechnete Spaltendefinition, die der Unterkategorie Tabelle hinzugefügt wurde. Sie bewertet einen Rang für jede Produktunterkategorie basierend auf den Spaltenwerten der Unterkategorie-Verkäufe .

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