MDX-Tutorial #4: Abfragen mit MDX-Sets

Besprochene Themen: MDX-Sets – oder auf deutsch: MDX-Mengen; der Doppelpunkt-Operator „:“

Was sind MDX-Sets?

Hallo und willkommen zurück zum MDX-Tutorial. Im vierten Teil geht es um Sets – oder auf Deutsch: um Mengen. Wozu wir Sets brauchen, sehen wir am besten anhand eines Beispiels. Beim letzten Mal haben wir festgestellt, dass die Verkäufe durch Vertriebspartner pro Jahr etwa 20 bis 30 Millionen Euro Umsatz generieren. Aber wie steht es um den Webshop? Einer der Marketing-Experten von Fahrrad.9000 behauptet, dass der Webshop komplett überflüssig ist. Kunden wollen seiner Meinung nach ein Fahrrad erst probefahren, bevor sie zugreifen. Und das ganze Internet ist sowieso nur eine vorübergehende  Erscheinung.

Nur gut, dass wir den Cube haben. Bestimmen wir zunächst den Internetumsatz pro Jahr. Das ist nichts Neues:

Abfrage analog zum letzten Teil des MDX-Tutorials: Den Internet-Umsatz pro Jahr abfragen.

SELECT [Measures].[Internet Sales Amount] ON COLUMNS,
[Date].[Calendar Year].[Calendar Year] ON ROWS
FROM [Adventure Works];

Also alles wie gehabt. Das ganze liefert uns:

Ergebnis der MDX-Abfrage: Internet-Umsatz für die Jahre 2001 bis 2004

Im Gründungsjahr haben wir mit Fahrrad.9000 mehr als 3 Millionen Euro über den Webshop eingenommen. In 2003 waren es bereits fast 10 Millionen Euro. Aber reicht das aus um die Behauptung des Marketing-Experten zu widerlegen? Am besten ist es wohl, wir vergleichen Online- und Offline-Umsatz miteinander. Aber wie war nochmal der Umsatz durch die Vertriebspartner? Der Mensch ist vergesslich, nur der Cube ist es nicht. Besser, wir lassen uns beide Kennzahlen gleichzeitig anzeigen.

Mit Sets mehrere Kennzahlen gleichzeitig ausgeben

Der Vergleich zwischen Online- und Offline-Umsatz fällt deutlich leichter, wenn die beiden Kennzahlen gemeinsam in einer Tabelle dargestellt werden. Das könnte dann etwa so aussehen:

Die gewünschte Tabelle erweitert die vorherige durch eine zusätzliche Spalte.

Die vorherige Tabelle soll also um eine zusätzliche Spalte erweitert werden, nämlich um den Offline-Umsatz, den wir durch die Verkäufe über unsere Vertriebspartner vor Ort erzielen. Die Abfrage dieser zusätzlichen Spalte geschieht in MDX genau dort, wo festgelegt wird, was in den Spalten angezeigt werden soll, also ON COLUMNS:

Ein erstes MDX-Beispiel für eine einfache Abfrage mit einem MDX-Set.

SELECT {[Measures].[Reseller Sales Amount],
[Measures].[Internet Sales Amount]} ON COLUMNS,
[Date].[Calendar Year].[Calendar Year] ON ROWS
FROM [Adventure Works];

Sowohl die Kennzahl für den Online-Umsatz als auch für den Offline-Umsatz werden ON COLUMNS – also zu Deutsch „auf die Spalten“ – ausgewählt. Da nun mehrere Kennzahlen abgefragt werden, müssen diese durch Mengenklammern {…} zu einem MDX-Set zusammengefasst werden.

Offenstichtlich stammt ungefähr ein Drittel des Umsatzes von Fahrrad.9000 aus dem Internet. Das ist eine ganze Menge und sollte dem Marketing-Experten vorerst zu denken geben.

MDX-Sets gruppieren gleichartige Elemente zu einer Menge

Die Kennzahlen in der vorherigen Abfrage sind in Mengenklammern {…} aufgeführt und bilden so ein MDX-Set. Sets werden in MDX immer dann verwendet, wenn auf mehrere Objekte zugegriffen werden soll, und diese Objekte vom gleichen Typ sind. Und genau das ist ja im Beispiel der Fall: Alle Elemente der Menge { [Measures].[Reseller Sales Amount], [Measures].[Internet Sales Amount] } sind Kennzahlen. Genauso könnten wir mehrere Jahre des Attributs „Kalenderjahr“ oder mehrere Kategorien des Attributs „Kategorie“ zu einer Menge zusammenfassen, etwa so:

Zwei Beispiele für MDX-Sets. Links: eine Menge mit drei Kalenderjahren, rechts: eine Menge mit zwei Kategorien.

Wichtig ist, dass ein Set immer nur aus gleichartigen Elementen besteht. Elemente aus verschiedenen Attributen dürfen nicht vermischt werden! In den ersten MDX Queries tappt man sehr gerne in die Falle und kombiniert Elemente aus unterschiedlichen Attributen zu einer Menge. Das führt zum Fehler „Die Elemente gehören zu unterschiedlichen Hierarchien in der -Funktion“. Falls diese Meldung auftritt, überprüfe die Sets: Stelle sicher, dass zwischen geschweiften Klammern nur Elemente des gleichen Attributs auftauchen. Das heißt, die Einträge der Menge dürfen sich nur hinter dem letzten Punkt unterscheiden.

Die sind keine MDX-Mengen, da die enthaltenden Elemente aus verschiedenen Dimensionen bzw. Attributen stammen.

Wenn Elemente verschiedener Dimensionen oder Attribute kombiniert werden sollen, entstehen keine Sets, sondern Tupel – darüber sprechen wir aber erst später.

Abfrage-Beispiel mit mehreren MDX-Sets

Mengen können auch in den Zeilen und im WHERE-Teil einer SELECT-Abfrage verwendet werden. Schauen wir uns dazu ein Beispiel an. Um dem Marketingexperten von Fahrrad.9000 das fürchten zu lehren, betrachten wir den Umsatz in drei bestimten Unterkategorien, nämlich für Fahrradhelme, Reifen & Schläuche sowie für Schutzbleche. Das geht so:

MDX-Query mit mehreren Sets - sowohl in den Zeilen und Spalten als auch in der WHERE-Bedingung.

SELECT {[Measures].[Reseller Sales Amount],
[Measures].[Internet Sales Amount]} ON COLUMNS,
{[Product].[Product Categories].[Subcategory].&[30],
[Product].[Product Categories].[Subcategory].&[31],
[Product].[Product Categories].[Subcategory].&[37]} ON ROWS
FROM [Adventure Works]
WHERE {[Date].[Calendar Year].&[2003], [Date].[Calendar Year].&[2004]};

Wie vorher wählen wir die zwei Kennzahlen zum Offline- und Online-Umsatz für die Spalten aus – oder jetzt vielleicht etwas präziser: Die Menge der zwei Kennzahlen wird auf die Spalten gesetzt. Die drei interessierenden Kategorien werden ebenfalls als Menge zusammengestellt und für die Zeilen ausgewählt. Das bewirkt zwei Dinge: Erstens wird der Umsatz für diese Kategorien getrennt ausgegeben. Jede Zeile enthält ausschließlich den Umsatz, der in einer einzelnen Kategorie angefallen ist. Zweitens schränkt die Menge der drei Kategorien die gesamte Abfrage auf nur diese Kategorien ein. Der Umsatz wird ausschließlich für Produkte aus den Unterkategorien 30 (Fahrradhelme), 31 (Reifen & Schläuche) und 37 (Schutzbleche) berechnet – den Rest lassen wir unter den Tisch fallen. Allem voran schränkt außerdem die WHERE-Bedingung den Umsatz auf die Jahre 2003 und 2004 ein.

Veranschaulicht: Auch in der MDX-SELECT-Klausel kann eine Einschränkung vorgenommen werden.

Das Ergebnis der Abfrage sieht so aus:

Ergebnis der vorherigen MDX-Abfrage: Die Kennzahlen pro Kategorie

Offenbar läuft der Vertrieb von Fahrradzubehör im Internet ausgesprochen gut, sogar deutlich besser als in den Fahrradläden vor Ort. Der Marketingexperte hat nicht daran gedacht, dass niemand Schutzbleche probefährt.

Große Mengen schnell mit dem Doppelpunkt ‚ : ‘ definieren

Einige unserer Vertriebspartner veranstalten alljährlich eine große Sommeraktion: Von Juni bis Oktober gibt es ein Gewinnspiel, das Neukunden gewinnen und den Umsatz steigern soll. Der Cube soll helfen, den Erfolg dieser Aktion zu messen. Dazu fragen wir den Umsatz für den Aktionszeitraum ab. Die einzelnen Monate können mit dem Attribut [Date].[Calendar].[Month] aus der Datums-Dimension abgefragt werden. Wenn wir wie oben vorgehen, müssen in der WHERE-Bedingung alle fünf Monate angegeben werden, wobei die Monate als Menge gruppiert werden:

Große MDX-Mengen auszuschreiben kann schnell unübersichtlich werden.

SELECT [Measures].[Reseller Sales Amount] ON COLUMNS,
{[Date].[Calendar].[Month].&[2003]&[6],
[Date].[Calendar].[Month].&[2003]&[7],
[Date].[Calendar].[Month].&[2003]&[8],
[Date].[Calendar].[Month].&[2003]&[9],
[Date].[Calendar].[Month].&[2003]&[10]}
ON ROWS
FROM [Adventure Works]

Ergebnis des MDX-Query

Hier ist es recht mühselig und unübersichtlich, alle Monate in der Menge aufzulisten. Glücklicherweise gibt es dafür eine recht nützliche Kurzschreibweise. Da die Monate in der Hierarchieebene „Monat“ aufeinander folgen, können wir den Doppelpunkt-Operator verwenden:

Mit dem Doppelpunkt kann eine große MDX-Menge ohne viel Schreibarbeit erzeugt werden.

SELECT [Measures].[Reseller Sales Amount] ON COLUMNS,
[Date].[Calendar].[Month].&[2003]&[6]:
[Date].[Calendar].[Month].&[2003]&[10]
ON ROWS
FROM [Adventure Works]

Hier dürfen keine Mengenklammern verwendet werden, denn der Doppelpunkt erzeugt bereits eine Menge. Der Ausdruck { A : B } wäre somit eine Menge, die eine Menge enthält – also etwas ziemlich kompliziertes, das wir gar nicht brauchen.

Bei der Verwendung des Doppelpunkts ist allerdings Vorsicht geboten. Der Cube entscheidet für A : B , welche Elemente zwischen A und B liegen, indem er nachsieht, in welcher Reihenfolge die Elemente im Attribut stehen. Was das heißt, sieht man recht gut am Attribut „Farbe“ aus der Dimension „Produkt“.

Der Von-Bis-Operator kann auch in nicht-numerischen Attributen verwendet werden.

Die Menge [Blue] : [Red] entspricht zum Beispiel den Elementen [Blue], [Grey], [Multi], [NA] und [Red]. Der „:“ vergleicht hier keine Werte der Größe nach und sortiert auch nicht alphabetisch – in die Menge gelangen schlicht diejenigen Elemente, die von den beiden angegebenen Elementen eingeschlossen werden. Und das gilt auch für numerische Attribute!  Das bedeutet insbesondere, dass bei einer falschen Sortierung innerhalb der Datums-Dimension die Menge [2002] : [2004] nicht zwingend die Jahre 2002 bis 2004 enthalten muss.

Beachte die Reihenfolge der Elemente eines Attributs, falls du ein MDX-Set mit dem Doppelpunkt erzeugst.

Weitere Möglichkeiten Mengen zu erzeugen

Es gibt noch eine ganze Reihe weiterer MDX-Befehle, mit denen Mengen erzeugt werden können, etwa die Differenz und die Vereinigung von Mengen. Dazu aber später mehr.

Das war es für diese Woche. Bei Unklarheiten oder Vorschlägen gilt wie immer: gerne eine E-Mail schreiben oder einfach einen Kommentar weiter unten hinterlassen.

Zur MDX-Tutorial-Überrsicht