Many – to – Many Beziehung im Tabular Cube

Beim Arbeiten mit dem Tabular Cube stolpert man unweigerlich irgendwann über den Punkt, an der die “normale” 1:n Beziehung nicht mehr ausreichend ist.

 

Für viele Anwendungen sehnt man sich die klassische Many-to-Many – Beziehung des OLAP Cubes herbei. Die gute Nachricht ist, sie lässt sich mittels DAX nachbauen.

Es gibt dafür auch bereits ein wirklich gutes WhitePaper von sqlbi, welches von Marco Russo und Alberto Ferrari verfasst wurde ( link ).

 

Ich möchte in diesem Blogbeitrag nicht einfach nur das angegebene Beispiel erklären, sondern anhand eines eigenen Cubes etwas Ähnliches nachbauen.

 

 

 

Datengrundlage

 

 

 

Grundlage dieses Cubes ist ein kleines DWH mit Testdaten, welches Umsätze anhand einer A, B, C – Klassifizierung von Kunden (mehrere Klassifizierungen eines Kunden über die Zeit möglich), der Zeit und des Kunden selbst beinhaltet.

 

 

 

Cubeaufbau

 

Der erstellte Cube sieht wie folgt aus:

 

 

Der Aufbau lehnt bereits an dem im WhitePaper beschriebenen Aufbau an.
Ich möchte ihn dennoch in diesem Beitrag noch einmal erläutern.

 

Die aus OLAP bekannte Bridge – Tabelle teilt sich mit der Faktentabelle die Dimension Zeit und Kunde. Die Klassifizierung soll mittels Many-to-Many erreicht werden.

Dazu wird diese regulär (in Tabular also mittels 1:n) an die Bridge – Tabelle gebunden.

Wird in der Auswertung (bspw. in Excel) nun nach einer Klassifizierung gefiltert, wird die Bridge – Tabelle durch die Beziehung implizit mit gefiltert.

 

Damit der Amount auch über die beiden gemeinsamen Dimensionen gefiltert werden kann, ist es von Nöten die Bridge – Tabelle zu nutzen um zu prüfen welche Reihen sichtbar gemacht werden sollen.

Dies geschieht über den gemeinsamen Schlüssel der gemeinsamen Dimensionen und der Verschiebung des Reihenkontextes in einen Filterkontext mittels CALCULATE:

 

AmountM2M :=
   CALCULATE (
      SUM( factSales[Amount] );
      SUMMARIZE( vw_brdKlasseVergleich_TH; vw_DimKunde[KundeID] );
      SUMMARIZE(vw_brdKlasseVergleich_TH; vw_dimDateVergleich[QuarterKey]))

 

Mittels SUMMARIZE werden lediglich die Zeilen in der Bridge – Tabelle geliefert, die durch den Schlüssel der gemeinsamen Dimension gefunden werden (eingeschränkt mittels Filter im Excel).

Das Ergebnis lässt sich hier ablesen (Vergleich SummeSalesAmount zu AmountM2M):

 

 

Man sieht, wie der SalesAmount nicht auf Grundlage der Klassifizierung ermittelt werden kann, sondern lediglich die korrekten Zahlen für die gemeinsamen Dimensionen Zeit und Kunde liefert.

 

Der Amount, der über das DAX Statement berechnet wird (AmountM2M_TH) liefert hingegen auch die Klassifizierungswerte.

Schreibe einen Kommentar