Distinct() und Values()

    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:

    AVG Pos := DIVIDE(COUNTROWS(SalesOrderDetail); COUNTROWS(DISTINCT(SalesOderDetail[SalesOrderId])))

    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:

    AVG Pos := DIVIDE(COUNTROWS(SalesOrderDetail); COUNTROWS(VALUES(SalesOderDetail[SalesOrderId])))

    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"

    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:

    Count Distinct:=COUNTROWS(Distinct(‘Dimension'[DimKey]))

    Count Values:=COUNTROWS(VALUES(‘Dimension'[DimKey]))

    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.

    Kategorien: Artikel, Funktionen, Power BI, Power Pivot
    Holger Gubbels

    Holger Gubbels ist Spezialist für alles, was mit Business Intelligence zu tun hat. Der Diplom-Informatiker strukturiert und löst als Data Scientist und Berater der mogular GmbH tagtäglich komplexe Problemstellungen rund um die Datenanalyse. Als Dozent der Hochschule für Technik Stuttgart ist er ein ausgewiesener Experte seines Fachs und gewohnt, Inhalte einfach zu erläutern. Genau das macht er auch hier in seinen Beiträgen für das PowerPivotInsights Blog. Zusätzlich ist er Autor für die Computerwoche und den Springer-Verlag. Sie erreichen ihn unter hg@mogular.com

    Antwort schreiben

    Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.