ALL Member in einer Many-To-Many Relationship

18. August 2010

Neulich im Projekt gab es die Anforderung, in einem SSAS Cube eine Many-To-Many Beziehung abzubilden. In diesem Artikel soll es nicht darum gehen, wie man diese Anforderung implementieren kann. Dafür gibt es einen sehr guten Artikel von Marc Russo:

http://www.sqlbi.eu/Portals/0/Downloads/M2M%20Revolution%201.0.93.pdf

Ich möchte hier auf ein Phänomen aufmerksam machen, das im Zusammenhang mit Many-To-Many Beziehungen zu beachten ist. Hat man eine solche Beziehung für seine Faktentabelle geschaffen und schaut sich die Zahlen im Cube an, so können die Zahlen für Verwirrung sorgen, insbesondere die Summenbildung scheint nicht nachvollziehbar zu sein. Hier hilft ein Eintrag, den ich auf sqlserveranalysisservices.com gefunden habe:

http://technet.microsoft.com/en-us/library/ms345139(SQL.90).aspx [UPDATE]

Dort steht der folgende wichtige Satz:

Except for the all member, the value for each member in a many-to-many dimension is the aggregate of the distinct set of granularity attribute members that exist with the many-to-many dimension member across the intermediate measure group.

Was bedeutet das? Das Beispiel in diesem Eintrag ist sehr gut verständlich. Es geht um Konten, die zu mehreren Personen gehören können. Gleichzeitig kann eine Person mehrere Konten besitzen; eine typische Many-To-Many Beziehung. Nehmen wir an, wir haben die folgende Siutation. Es gibt zwei Konten und drei Kunden. Das erste Konto gehört Jane und John zusammen, das zweite gehört Henry. Jane und John haben 100 $ auf ihr Konto eingezahlt, Henry hat 150 $ auf sein Konto eingezahlt. So weit so gut.

Da wir eine Many-To-Many Beziehung zwischen den Kunden und den Konten haben, würde eine Auflistung der Transaktionen nach Kunden wie folgt aussehen:

  • John: $ 100
  • Jane: $100
  • Henry: $150
Würden wir die Summe daraus bilden, so kämen wir auf 350$ auf den beiden Konten zusammen, was offensichtlich falsch wäre. Der Cube ist aber hier schlau genug, nur die distinkten Werte aus der Many-To-Many Beziehung zu summieren, und gibt dementsprechend $250 als Summe aus. Das freut uns! Die Antwort, warum dies so ist, findet sich ebenfalls in dem Artikel:

The amount for the all member of a Many-to-Many dimension is the aggregate of all facts.

Zusammengefasst bedeutet das, dass für jedes Attribut einer Dimension in einer Many-To-Many Beziehung die Werte über die Zwischentabelle aufgelöst werden und entsprechend korrekt angezeigt werden. Der ALL-Member stellt eine Ausnahme dar; er ignoriert die Many-To-Many Beziehung und summiert nur die Werte in der Faktentabelle.