Das beste Feature in DAX seit CALCULATE()?: DAX-Variablen

DAX ist ein wesentlicher Bestandteil der Analyse-Möglichkeiten in Power BI, Power Pivot und SSAS Tabular. Bei der Berechnung von Ergebnissen führen oftmals viele Wege zum Ziel. Allein dieses Ziel zu erreichen, kann manchmal bereits ein Problem darstellen. Eine besondere Herausforderung liegt aber darin, das Ergebnis mit möglichst verständlichem und performantem DAX-Code zu erzielen. DAX-Variablen sind ein Baustein auf dem Weg dorthin.

Stimmt die Aussage  "Das beste Feature in DAX seit CALCULATE()?: DAX-Variablen" also wirklich? Lies den folgenden Artikel und entscheide selbst...

Was sind DAX-Variablen und warum solltest Du sie nutzen?

In der Programmierung stellen Variablen quasi Container für digitale Daten dar. Der Begriff verdeutlicht bereits eine wesentliche Eigenschaft von Variablen: Die ihnen zugewiesenen digitalen Daten sind veränderbar.

Was aber macht DAX-Variablen nun so mächtig, dass sie in manchen Artikeln sogar als "Game Changer" in der DAX-Programmierung gefeiert werden?

Zu den am häufigsten genannten Vorteilen durch die Nutzung von Variablen gehören:

  • Variablen vereinfachen die Umsetzung bestimmter Lösungen im DAX-Code.
  • Variablen erhöhen die Verständlichkeit und Wartbarkeit des Codes, da sie zum einen die Lesbarkeit verbessern und zum anderen verhindern, dass notwendige Code-Anpassungen an mehreren Stellen im Code zu erfolgen haben.
  • Mit den ersten beiden Punkten geht auch die Steigerung der Wiederverwendbarkeit bzw. Transferierbarkeit von DAX-Code einher.
  • Variablen können die Berechnungsgeschwindigkeit des Codes positiv beeinflussen.

Lass uns im Folgenden einen genaueren Blick auf die genannten Aspekte von Variablen werfen. Doch zunächst...

Wo kannst Du DAX-Variablen überhaupt nutzen?

Variablen sind ein so genanntes "DAX 2015"-Feature. Sie stehen seit einer Erweiterung von DAX aus dem Jahr 2015 zur Verfügung. Entsprechend sind sie in allen Tools enthalten, die nach dieser Erweiterung erschienen sind. Namentlich sind dies Power Pivot für Excel 2016 oder später, SSAS Tabular ab SQL Server 2016 oder später und natürlich Azure Analysis Services und Power BI Desktop, die durch ihren schnellen Release-Zyklus quasi ständig über die aktuellste DAX-Version verfügen.

Nutzen kannst Du Variablen in Measures, berechneten Spalten und in DAX-Queries.

Welche Syntax musst Du bei DAX-Variablen beachten?

Die grundsätzliche Syntax zur Deklaration einer Variablen in DAX-Measures oder berechneten Spalten lautet:

VAR    <VariablenName> = <ZuzuweisenderAusdruck>

 

RETURN

           <Ausdruck, in dem die Variable verwendet werden kann>


Das Schlüsselwort VAR leitet die Deklaration ein, in der zunächst der Name der Variable festgelegt wird. Die Namensvergabe unterliegt bestimmten Regeln. Der Name darf keine Leer- oder Sonderzeichen enthalten bzw. nicht mit einer Ziffer beginnen. Die Verwendung von intern reservierten Begriffen ist ebenso nicht zulässig, wie der Name einer existierenden Tabelle.

Durch das Gleichheitszeichen wird dem Variablennamen dann der Ausdruck zugewiesen, der in der Variable gespeichert werden soll. Dabei kann es sich um Texte, Zahlenwerte oder Funktionen handeln. Funktionen können skalare Werte oder auch ganze Tabellen an die Variable zurückgeben.

Anders als in anderen Programmiersprachen ist die explizite Zuweisung eines Datentyps zu einer Variablen in DAX nicht erforderlich bzw. möglich. Du kannst beliebig viele Variablen definieren. Jeder dieser Definitionen muss dann das Schlüsselwort VAR vorangestellt werden.

Die Deklaration der Variablen beschließt Du mit dem Schlüsselwort RETURN. Nach RETURN folgt der Ausdruck, der vom Measure oder der berechneten Spalte kalkuliert und ausgegeben werden soll. Dort kannst Du die vor dem RETURN definierten Variablen verwenden.

Folgendes Beispiel in Power Pivot (Excel 2016) zeigt, wie das gleiche Measure mit und ohne Verwendung von DAX-Variablen aussehen kann:

Power Pivot, DAX, SSAS Tabular, Power BI Desktop
Beispiel-Measure mit und ohne Verwendung von Variablen (KLICK TO ZOOM)

Ohne jetzt auf die genaue Funktionsweise des Codes einzugehen, kannst Du an diesem Beispiel bereits einige der eingangs formulierten Vorteile von Variablen erkennen. Die "ErfolgsbewertungMitVariablen" (links) wirkt geordneter, übersichtlicher und ist besser lesbar. Sprechende Variablennamen tragen zur Verständlichkeit des Codes bei. Der Code ist zudem leichter wartbar, da etwaige Anpassungen nicht an mehreren Stellen im Code, sondern nur in der Variablen-Definition erfolgen müssen.

In DAX-Queries hast Du ebenfalls die Möglichkeit Variablen einzusetzen. Dies sieht wie folgt aus:

DEFINE

 

MEASURE <TabellenName>[MeasureName] = <MeasureAusdruck>

 

VAR    <VariablenName> =  <ZuzuweisenderAusdruck>

 

EVALUATE

           <Tabellenausdruck, in dem die Variable verwendet werden kann>


Auch im folgenden Code-Beispiel soll es weniger um den Inhalt bzw. die Funktionsweise der DAX-Query gehen. Vielmehr wollen wir uns auch hier die Syntax vergegenwärtigen, die wir bei der Nutzung von Variablen in DAX-Queries beachten müssen:

Power Pivot, DAX, Power BI Desktop, SSAS Tabular, Variablen, Variables
Klassische Syntax von Variablen bei der Verwendung in DAX-Queries (KLICK TO ZOOM)

Nach dem Schlüsselwort DEFINE folgt in DAX-Queries der Bereich, in dem klassischerweise abfragebezogene Measures definiert werden können (Schlüsselwort MEASURE). Allerdings kannst Du dort über das Schlüsselwort VAR auch Variablen definieren, die Du dann im Tabellenausdruck nach dem EVALUATE-Statement nutzen kannst. Das Schlüsselwort RETURN wird in diesem Fall nicht benötigt.

Wo kannst Du DAX-Variablen sonst noch definieren?

Neben diesen beiden grundlegenden Syntax-Formen gilt folgende Grundaussage zur Definition von DAX-Variablen:

"Variablen können an allen Stellen innerhalb des DAX-Codes definiert und verwendet werden, an denen Du einen Ausdruck verwenden kannst."

Power BI Desktop, SSAS Tabular, Power Pivot, DAX, Variablen, Variables
Definition von Variablen im "Measure-Body" anstatt im "Measure-Head" (KLICK TO ZOOM)

Das obige Beispiel-Measure zeigt, dass die Variablen "varAnzGold", "varAnzSilber" und "varAnzBronze" z.B. auch innerhalb der CALCULATE-Funktion definiert werden können. An Stelle des ersten Parameters der Funktion werden die Variablen über das Schlüsselwort VAR definiert und über das Schlüsselwort RETURN verwendet.

Gleiches lässt sich innerhalb von DAX-Queries realisieren. So kannst Du die Variable "varListeSportler" in diesem Beispiel auch an Stelle des ersten Parameters des Tabellenausdrucks ADDCOLUMNS() definieren. ADDCOLUMNS() verlangt als ersten Parameter eine Tabelle und der Variable "varListeSportler" ist ein Tabellenausdruck (Tabelle "Athleten") zugeordnet.

Power Pivot, SSAS Tabular, Power BI Desktop, DAX, Variablen, Variables
Definition von Variablen im Tabellenausruck der DAX-Query (KLICK TO ZOOM)

Derartige Definitionen von Variablen sind in DAX syntaktisch also vollkommen zulässig. Im Folgenden werden wir aber sehen, dass die Art der Variablen-Definition nicht nur eine rein syntaktische Frage ist. Vielmehr kann sie zu unterschiedlichen Ergebnissen in Measures, berechneten Spalten und DAX-Queries führen und auch die Berechnungsgeschwindigkeit beeinflussen.

DAX-Variablen und der "Evaluation Context"

Der "Evaluation Context" ist wahrscheinlich das zentrale Konzept zum Verständnis der Sprache DAX und zur Nutzung ihrer Möglichkeiten. Obwohl für die folgende Diskussion ein gewisses Verständnis dieses Konzepts Voraussetzung ist, kann es in seiner ganzen Tragweite an dieser Stelle leider nicht erläutert werden. Solltest Du Dich hierzu einlesen wollen, empfehle ich Dir folgenden Auszug aus dem Buch "The Definitive Guide to DAX" von Marco Russo und Alberto Ferrari

Die wahre Stärke von Variablen in DAX liegt in folgendem Umstand begründet:

"DAX-Variablen werden in dem Kontext evaluiert, in dem sie definiert werden und nicht in dem, in dem sie verwendet werden."

Power Pivot, DAX, Power BI Desktop, SSAS Tabular; Variablen, Variables
Variablen werden in dem Kontext evaluiert, in dem sie definiert werden (KLICK TO ZOOM)

Im Beispiel soll das Measure den Anteil der weiblichen Teilnehmer bei den Olympischen Spielen 2016 in Rio errechnen (Measure "AnteilFrauenAnTeilnehmern"). Die Variable "varAnzAthleten" wird dabei im Filter-Kontext der Pivot-Tabelle (also der einzelnen Nationen) bestimmt und ermittelt die Anzahl aller Athleten. Die Variable "varAnzFrauen" enthält exakt den gleichen Ausdruck wie die Variable "varAnzAthleten", zählt allerdings nur die weiblichen Teilnehmer, weil sie innerhalb von CALCULATE() und damit im Kontext der Nebenbedingung "Athleten[Geschlecht]=female" evaluiert wird. Obwohl zur Berechnung des eigentlichen Anteils dann beide Variablen innerhalb der CALCULATE()-Funktion verwendet werden, ändert das das Ergebnis von "varAnzAthleten" nicht, so dass der korrekte Anteil ausgegeben wird.

Das gleiche Prinzip gilt natürlich auch im Falle mehrerer ineinander geschachtelter Zeilen-Kontexte:

Power Pivot, Power Bi Desktop, SSAS Tabular, DAX, Variablen, Variables
Verwendung von Variablen in geschachtelten Zeilen-Kontexten (KLICK TO ZOOM)

Im Beispiel soll in einer berechneten Spalte in der Tabelle "Athleten" für jeden Teilnehmer ermittelt werden, wieviele Athleten mehr Medaillen gewonnen haben, als er selbst. Das Beispiel zeigt, dass mit Hilfe von Variablen im inneren Zeilen-Kontext der FILTER()-Funktion auf Werte des äußeren Zeilen-Kontexts zugegriffen werden kann, ohne dass sich das Ergebnis von "varAnzMedaillen" bei der Verwendung im inneren Zeilen-Kontext verändert. Wolltest Du die gleiche Berechnung ohne Variablen durchführen, müsstest Du den DAX-Code um die Funktion EARLIER() erweitern, um auf den äußeren Zeilen-Kontext zugreifen zu können und so das Kriterium "4" zu ermitteln. Im inneren Zeilen-Kontext (gefilterte Tabelle mit den drei Datensätzen) existiert nämlich keine Zeile mit "AnzMedaillen=4". Die Berechnung würde sonst keine sinnvollen Ergebnisse liefern können.

Variablen machen Dir die DAX-Programmierung also leichter. Sie geben Dir die Möglichkeit Filter- oder Zeilen-Kontexte zu konservieren und so quasi "Snapshots" von Ergebnissen und Tabellen in einem bestimmten Kontext zu machen und diese zu verwenden.

Die Schwierigkeit in der DAX-Programmierung liegt sehr häufig im Verhalten von Ausdrücken innerhalb mehrfach geschachtelter Kontexte. Dadurch entstehen nicht selten schwer nachvollziehbare Berechnungsergebnisse. Bei Variablen musst Du Dir keine Gedanken machen, ob sich das Ergebnis Deiner Berechnung ändert, weil Du die Ergebnisse in einem neuen Kontext weiterverarbeitest.

Der Geltungsbereich von DAX-Variablen

Variablen können grundsätzlich auf alle Strukturen des Datenmodells (Tabellen, Spalten, Measures etc.) zugreifen. Die Gegenrichtung, also der Zugriff auf Variablen aus Measures, berechneten Spalten, DAX-Queries und anderen Variablen unterliegt hingegen gewissen Einschränkungen.

Measures, berechnete Spalten und DAX-Queries können auf eine Variable nur dann zugreifen, sofern die Variable im jeweiligen Measure oder der jeweiligen berechneten Spalte bzw. der DAX-Query definiert wurde. Anders als in anderen Programmiersprachen gibt es in DAX keine "projektöffentlichen" bzw. "globalen" Variablen. Auf ideas.powerbi.com kannst Du allerdings für die Einführung solcher Variablen abstimmen.

Power BI Desktop, DAX, Power Pivot, SSAS Tabular, Variablen, Variables
Variablenzugriff außerhalb der Measure-Definition (KLICK TO ZOOM)

Dies ist auch der Grund, warum es z.B. nicht möglich ist eine im "Head" einer DAX-Query definierte Variable in einem abfragebezogenen Measure zu verwenden, das ebenfalls im Head der selben DAX-Query definiert wurde. Da auch solche Measures den gleichen Einschränkungen unterliegen wie "normale" DAX-Measures, können sie nicht auf eine außerhalb des Measures definierte Variable zugreifen. Die Abbildung links zeigt die resultierende Fehlermeldung.

Wie weiter oben bereits beschrieben, kannst Du Variablen innerhalb der Definition eines Measures, einer berechneten Spalte oder einer DAX-Query an Stelle eines Ausdrucks definieren. Dabei beschränkt sich der Geltungsbereich der Variable auf den jeweiligen (Unter-)Ausdruck, der durch das Schlüsselwort RETURN eingeleitet wird. Die folgende Abbildung zeigt das Prinzip anhand eines Beispiel-Measures:

Power Pivot, Power BI Desktop, SSAS Tabular, DAX, Variablen, Variables
Der Gültigkeitsbereich von Variablen (KLICK TO ZOOM)

Zunächst fällt auf, dass es vollkommen zulässig, wenn auch nicht ratsam, ist, mehrere Variablen mit dem gleichen Namen zu definieren, solange die Definition in einem separaten Ausdrucksbereich (separates RETURN) vorgenommen wird. Nicht zulässig wäre es, "varNation=GBR" direkt hinter "varNation=USA" in der obersten Variablen-Deklaration zu definieren. Entsprechend hast Du auch nicht die Möglichkeit "varNation" in der obersten Variablen-Deklaration auf einen anderen Wert als "USA" zu ändern. Insofern handelt es sich bei DAX-Variablen in gewisser Weise eher um Konstanten und nicht um Variablen, wie man sie aus anderen Programmiersprachen kennt.

 

Die Variable besitzt dann für den gesamten Ausdruck Gültigkeit, der ihrem RETURN-Statement folgt. Auf die Variable "varNation=USA" kann also z.B. im gesamten "Bereich (1)", auf "varNation=GER" im gesamten "Bereich (2)" zugegriffen werden. Im "Bereich (3)" steht "varNation=GER" entsprechend nicht zur Verfügung. Das gleiche Prinzip gilt natürlich auch für DAX-Queries. In einer DAX-Query, die mehrere Tabellenausdrücke (Schlüsselwort EVALUATE) zurückgibt, können alle Tabellenausdrücke auf Variablen zugreifen, die im "Head" (nach DEFINE) definiert wurden. Auf Variablen, die in den einzelnen Tabellenausdrücken definiert wurden, kann nicht gegenseitig zugegriffen werden.

Stehen mehrere Variablen mit dem gleichen Namen zur Verfügung, wird immer die dem Ausdruck nächstgelegene Version verwendet. So gilt in "Bereich (3)" "varNation=GBR", obwohl auch "varNation=USA" im Bereich Gültigkeit besitzt. Würden wir die Definition von "varNation=GBR" entfernen, so würde im "Bereich (3)" wieder gelten "varNation=USA".

Power Pivot, DAX, SSAS Tabular, Power BI Desktop, Variablen, Variables
DAX-Variablen werden sequenziell evaluierte (KLICK TO ZOOM)

Grundsätzlich hast Du natürlich auch die Möglichkeit Variablen in anderen Variablen zu verwenden. Neben dem Gültigkeitsbereich der Variablen, die Du verwenden willst, musst Du dafür auch immer die Definitionsreihenfolge der Variablen beachten. Variablen werden sequenziell evaluiert. Die Verwendung in falscher Reihenfolge, wie im Beispiel rechts, führt unweigerlich zur entsprechenden Fehlermeldung.

Abschließend bleibt noch darauf hinzuweisen, dass auf Variablen, denen ein Tabellenausdruck zugewiesen wurde, nicht in der Form 'VariablenName'[Spaltenname] zugegriffen werden kann.

Verbessere die Performance mit DAX-Variablen!

Variablen werden nur einmal evaluiert. Die Ergebnisse werden als Werte oder Tabellen in der Variable gespeichert und können immer wieder verwendet werden. Bei komplexen Ausdrücken kann dies zu einem erheblichen Vorteil in der Berechnungsgeschwindigkeit führen, wenn ein solcher Ausdruck nur einmal und nicht bei jeder erneuten Verwendung im Code berechnet werden muss.

Durch geschickte Festlegung des Definitionsortes Deiner Variablen (z.B. "Body" oder "Head" einer DAX-Query) kannst Du eine hohe Wiederverwendbarkeit der Variablen und damit schnellere Berechnungen erreichen.

DAX-Variablen unterliegen zudem der so genannten "Lazy-Evaluation". Variablen werden nur dann evaluiert, wenn Sie auch verwendet werden. Solltest Du, aus welchen Gründen auch immer, eine Variable nach der Definition nicht weiter verwenden, erzeugt sie also keine Rechenlast.

Mein Fazit

Mit Variablen kannst Du erhebliche Vorteile in der DAX-Programmierung nutzen. Neben verbesserter Nachvollziehbarkeit, Wartbarkeit und Berechnungsgeschwindigkeit Deines Codes, ermöglichen Sie Dir vor allem durch die Konservierung des "Evaluation Contexts", in dem sie definiert wurden, eine vereinfachte Umsetzung mancher Lösung.

Ob Variablen für Dich deshalb das beste Feature in DAX seit CALCULATE() sind, weiß ich natürlich nicht. Trotzdem empfehle ich Dir Variablen zu nutzen und nicht auf die genannten Vorteile zu verzichten. Auch wenn die Nutzer Deiner Lösung in Power Pivot, Power BI oder SSAS Tabular nicht immer etwas davon merken: Mach Dir das Leben selbst leichter!

 

Ich wünsche Dir viel Spaß dabei! Wenn es Dir gefallen hat, dann teile den Artikel auch mit Anderen.

 

Bis zum nächsten Mal!

 

Viele Grüße aus Hamburg

 

Uwe

BESTENS INFORMIERT
Entwickle Dein Know-How und Deine Möglichkeiten im Reporting
und erhalte mit dem Newsletter exklusive Beispieldateien
zu unseren Artikeln

DURCHSUCHE data-insights.de...

RSS-FEED BI BLOG...


Kommentar schreiben

Kommentare: 4
  • #1

    Lars (Samstag, 21 Oktober 2017 08:45)

    Moin Uwe,

    das ist ein toller Überblick über die Möglichkeiten, die man mit der Verwendung von Variablen hat. Habe ich in diesem Umfang noch nirgendwo gefunden. Speziell die Tatsache, dass man Variablen auch innerhalb eines CALCULATE-Statements definieren kann und der entsprechende Filterkontext gleich mitgespeichert wird, fand ich extrem interessant.

    Danke und liebe Grüße,
    Lars

  • #2

    Uwe (Samstag, 21 Oktober 2017 09:20)

    Hallo Lars,
    vielen Dank! Freut mich sehr, wenn Leser Dinge in meinen Beiträge entdecken, dessen sie sich nicht bewusst waren.

    LG

    Uwe

  • #3

    Stephan (Montag, 23 Oktober 2017 11:10)

    Hi Uwe!
    Da ist Dir eine sehr gute, weil ausführliche und präzise Beschreibung gelungen. Toll und inspirierend. Ich habe sofort ein paar Ideen, die ich so umsetzen werde!
    Viele Grüße
    Stephan

  • #4

    Uwe (Montag, 23 Oktober 2017 12:06)

    Vielen Dank Stephan! Freut mich, wenn es Dir weiterhilft. Von "Inspiration" hatte ich nicht mal zu träumen gewagt! :-)

    LG
    Uwe