Ein kleines Intro in DAX

Wer Power BI, Power Pivot oder SSAS verwendet, trifft früher oder später auf die ‘Data Analysis Expressions’ oder kurz DAX. Jeder, der eigene Kennzahlen oder Berechnungen in einem Bericht anzeigen will, wird mit DAX in irgendeiner Weise in Berührung kommen. Dieses kleine Intro soll die ersten Schritte mit DAX in PowerBI erleichtern.

Spalten und Measures in Power BI

Entweder es gilt eine berechnete Spalte zu erstellen oder aber berechnete Measures. Für beide Fälle wird dafür ein DAX-Ausdruck erstellt. Eine berechnete Spalte ist wie in Excel ein berechneter Wert, der sich auf eine Zeile bezieht, während ein Measure Summen, Mindest-, Mittel-, oder Höchstwerte (usw) anzeigt. 

Wie im Bild sichtbar, gibt es auch noch Quick-Measures. Damit können häufig benötigte Measures schnell hinzugefügt werden, ohne ein DAX-Ausdruck selbst schreiben zu müssen. In einem Dialogfenster kann die gewünschte Berechnung ausgewählt und die nötigen Daten-Felder definiert werden. Der so entstandene DAX-Ausdruck lässt sich danach noch anpassen oder erweitern. 

Grundaufbau

Der Syntax eines DAX-Ausdrucks besteht immer aus denselben Elementen. Zuerst wird die Spalte oder das Measure benannt (A), gefolgt von einem Gleich-Zeichen (B). Dahinter folgt dann die eigentliche DAX-Formel. Das Beispiel hier zeigt eine berechnete Spalte, welche den Unterschied von zwei Zeitstempeln in Minuten ausgibt.

Die Formel startet mit der DAX-Funktion (C), im Beispiel oben DATEDIFF. Innerhalb der Klammern (D) werden dann die Parameter übergeben (E), so wie wir das von Excel-Formeln wohl schon lange kennen. Im Beispiel wurden 2 andere Spaltenwerte mit übergeben. ‘ExampleLog’ definiert die Tabelle und in eckigen Klammern wird das Feld geschrieben. Wenn der Tabellen-Name Leerzeichen beinhalten sollte, schreibt man ihn in Hochkomas. Aber auch das kennen wir als langjährige Excel-Formel-Editoren ja schon.

Variablen

Damit gewisse Berechnungen innerhalb eines DAX-Ausdruckes nicht mehrmals durchgeführt werden müssen, können Zwischenresultate in Variablen gespeichert werden. Das 2min-Video von Microsoft erklärts:

Variablen erhöhen somit die Lesbarkeit und die Performance eines DAX-Ausdrucks. Das Beispiel zeigt das gut auf

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

Die Formel funktioniert einwandfrei: Es wird vom aktuellen Verkauf der Vorjahresverkauf abgezogen und nochmals durch den Vorjahresverkauf geteilt. Wenn wir die Formel nun aber anpassen möchten, müssen wir stets an zwei Orten die Formel anpassen. Besser wäre daher folgende Formel:

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

Es passiert das genau selbe. Aber diesmal wird der Vorjahresverkauf in der Variable SalesPriorYear gespeichert. Diese Berechnung findet nur einmal statt. Für das Resultat selbst wird die Berechnung zurückgegeben, welche nach RETURN steht.

Kleiner Tipp: Verwenden Sie die Funktion DIVIDE anstelle des Divisionsoperators (/). Der Nenner darf nicht 0 sein. Er könnte hier sogar NULL sein. Also müsste zuerst noch mittels IF geprüft werden, ob der Nenner 0 oder NULL ist:

Marge =
IF ( OR ( ISBLANK ( [Sales] ), [Sales] == 0 )BLANK (), [Profit] / [Sales] )

Wenn [Sales] 0 oder NULL ist, wird BLANK() zurückgegeben. DIVIDE macht das automatisch. Die Formel liest sich nicht nur einfacher, die Berechnung ist auch effizienter.

Marge =
DIVIDE ( [Profit], [Sales] )

Tabellenbeziehungen mit DAX

In Power BI können Beziehungen zwischen mehrere Tabellen konfiguriert werden. Das kennen wir auch aus jedem relationalen Datenbanksystem so.

Mit DAX können auch Abfragen erstellt werden, welche auf diesen Beziehungen basieren. So lassen sich in der «many»-Tabelle mittels der DAX-Funkton RELATED einzelne Felder des verknüpften Datensatzes holen. Das Beispiel holt hier Daten aus der country-Tabelle:

CustomerCountry =
RELATED ( country[State] ) & ", "
    RELATED ( country[Country] )

Die RELATED Funktion kann für n:1 Beziehungen verwendet werden. Ein anderes Beispiel wäre in einer Verkaufstabelle zum Produkt noch die Produktionskosten pro Stück zu holen, um den Ertrag direkt ausrechen zu können.

 

Wenn nun aber in der Länderliste die Anzahl der Kunden angezeigt werden soll, hilft die RELATEDTABLE Funktion. 

NumberOfCustomers =
COUNTROWS ( RELATEDTABLE ( customer ) )

Die RELATEDTABLE Funktion kann für 1:n Beziehungen verwendet werden. Es ist somit nicht möglich, in der Länderliste den Namen des Kunden zu sehen, da es mehrere Kunden sein können (Aggregations-Funktionen mal aussen vor). Luzern hat in dem Beispiel 2 Kunden. Ein anderes Beispiel wäre in der Produkte-Tabelle die Anzahl Verkäufe anzuzeigen, oder den Ertrag zu summieren, welcher zuvor oben mit RELATED genannt wurde.

 

Diese kurze Einführung kratzt noch an der Oberfläche. DAX ist eine mächtige Formelsprache. Die einzelnen Funktionen sind in der DAX-Funktionsreferenz mit Beispielen erklärt: https://docs.microsoft.com/de-de/dax/.