Die DAX-Funktionen Distinct() und Values() geben beide eindeutige Werte einer Spalte zurück. Trotzdem unterscheiden sich beide Funktionen. Im heutigen Artikel zeigen wir Ihnen, welches Detail man übersehen kann.

Distinct in SQL

Vielleicht kennen Sie den DISTINCT-Befehl aus SQL: Wenn Sie wissen wollen, wie viele Aufträge im System sind, Ihnen aber nur die Positionstabelle zur Verfügung steht: Select Distinct(SalesOrderId) From SalesOrderDetail Dadurch erhalten Sie alle eindeutigen SalesOrderId Werte zurück.

Distinct in DAX

In DAX geht das genauso. Möchten wir ermitteln, wie viele Positionen im Schnitt ein Auftrag hat, können wir folgende Formel definieren:

Values()

Die Funktion Values() gibt ebenfalls eine eindeutige Liste von Werten einer Spalte zurück. Values() hat zusätzlich die Eigenschaft, dass wenn die Liste genau einen Eintrag enthält, der Rückgabewert nicht eine Liste mit einem Eintrag ist, sondern der Eintrag selbst – wir in unserem Blog-Beitrag ausführlich beschrieben. Trotzdem macht Values() bei mehr als einem Wert irgendwie das gleiche wie Distinct(). D.h. in Anlehnung an das obige Beispiel können wir auch schreiben:

Das Ergebnis ist identisch…

Automatische Dimensionserweiterung

Nehmen wir an, wir haben eine Dimensionstabelle mit den Schlüsseln A und B sowie eine Faktentabelle mit den Fremdschlüsseln A, B, C. Das bedeutet, dass wir eigentlich eine Inkonsistenz haben, da C in der Dimensionstabelle nicht vorkommt: Beispieldaten Dimension und Fakt Verknüpfen Sie jetzt die beiden Tabellen über die Spalten DimKey. Erstellen wir eine Pivot-Tabelle und werten die Anzahl Fakten pro Dimension aus, erhalten wir folgendes Ergebnis: ![Pivot-Tabelle mit generiertem Dimensioneintrag "Leer"](139imagethumb-9.png "Pivot-Tabelle mit generiertem Dimensioneintrag "Leer"") Würde die Pivot-Tabelle nur vorhandene Zeilen der Dimension als Grundlage nehmen und davon ausgehend die Fakten gezählt werden, wäre das Gesamtergebnis falsch. Die Zeilen mit DimKey C in der Faktentabelle würden unter den Tisch fallen. Daher wird in den Dimensionen im Falle einer Inkonsistenz der Daten (fehlende Schlüssel) automatisch eine Zeile mit Wert Blank() hinzugefügt. Gesehen haben Sie das sicher schon oft.

Der Unterschied zwischen Distinct() und Values()

Auf der Dimension formulieren wir zwei Measures:

Das Ergebnis: Ergebnis der beiden Measures mit Distinct und Values VALUES() zählt also die BLANK-Zeile in der Dimension mit, DISTINCT nicht.

Gegenprüfung

Löschen Sie einfach mal die Verknüpfung zwischen den beiden Tabellen, so dass keine Beziehung mehr besteht: Ergebnis der beiden Measures - ohne bestehende Tabellenbeziehung Die BLANK-Zeile ist jetzt nicht mehr vorhanden, da es keinen Grund mehr gibt, wenn die Verknüpfung fehlt.