MDX-Fehler: Die Hierarchie wird bereits auf der Achse angezeigt.

Soforthilfe gegen den MDX-Fehler „Die … Hierarchie wird  bereits auf der … Achse angezeigt“. Aus der Reihe „Unsere beliebtesten MDX-Fehlermeldungen und solche die es werden wollen“.

Was bedeutet die Fehlermeldung „Die … Hierarchie wird bereits auf der … Achse angezeigt“?

In den meisten Fällen taucht der Fehler auf, wenn wir versuchen, mit  der WHERE-Bedingung auf ein Attribut einzuschränken, das wir gleichzeitig ausgeben wollen – also etwa so:
e1-beispiel-tabelle

Hier wird die Kategorie pro Zeile ausgegeben und gleichzeitig auf zwei bestimmte Kategorien eingeschränkt. Die zugehörige falsche MDX Abfrage für den Adventure Works Cube lautet beispielsweise:

e1-falsch-attribut-darf-nicht-achse-und-bei-where-verwendet-werden

SELECT [Measures].[Internet Sales Amount] ON COLUMNS,
[Product].[Category].[Category] ON ROWS
FROM [Adventure Works]
WHERE {[Product].[Category].&[1], [Product].[Category].&[3]}

Das klappt so leider nicht. Die Ausführung wird mit der Fehlermeldung  „Die Category-Hierarchie wird bereits auf der Axis1-Achse angezeigt“  abgebrochen. In der englischen Version klingt das natürlich noch viel besser: „Hierarchy already appears in the … axis“. Das Problem ist, dass in MDX-Abfragen jedes Attribut nur an einer Stelle verwendet werden darf – also entweder in den Spalten oder in den Zeilen oder in der WHERE-Einschränkung.

Die Lösung: Die WHERE-Einschränkung in den SELECT-Teil verschieben

Wenn die  Wut auf den Cube langsam nachlässt, bauen wir die Abfrage so um,  dass sie funktioniert. Der Trick ist, die Einschränkung nicht im  WHERE-Teil anzuwenden, sondern direkt dort, wo das Attribut angezeigt werden soll:

e1-fehler-hierarchie-wird-bereits-achse-angezeigt-loesung

SELECT [Measures].[Internet Sales Amount] ON COLUMNS,
{[Product].[Category].&[1], [Product].[Category].&[3]} ON ROWS
FROM [Adventure Works]

Auf diese Weise taucht das Attribut nur noch in den Zeilen auf, und der Fehler ist beseitigt. Vor allem für SQL-Veteranen ist die Einschränkung im SELECT-Teil sicher zu Beginn ungewohnt. In MDX ist das aber durchaus so gewollt und gängig. Der dritte Teil des MDX-Tutorials geht etwas genauer auf die Unterschiede zwischen SQL- und MDX-Abfragen ein.

Eine weitere Lösung

Falls die Fehlermeldung sich auf ein Attribut bezieht, dass in der Dimension zusätzlich auch als Hierarchie vorliegt, gibt es noch eine zweite Möglichkeit den Fehler zu umgehen:

e1-fehler-loesung-2

SELECT [Measures].[Internet Sales Amount] ON COLUMNS,
[Product].[Category].[Category] ON ROWS
FROM [Adventure Works]
WHERE {[Product].[Product Categories].[Category].&[1],
[Product].[Product Categories].[Category].&[3]}

Das Attribut wird weiterhin zeilenweise ausgegeben, kommt jetzt aber nicht mehr in der WHERE-Klausel vor. Dort wird stattdessen durch das Duplikat in der Hierarchie eingeschränkt. Da die Hierachieebene auf die gleichen Elemente verweist, funktioniert die Abfrage wie gewünscht. Das ist zwar keine besonders elegante Lösung,  funktioniert aber. Trotzdem empfehle ich, stets die erste Variante von  oben zu verwenden.

Hat das den Fehler nicht beseitigt?

Falls du die Fehlermeldung trotz dieser Lösungsvorschläge nicht beheben kannst, kannst du mir gern eine E-Mail schreiben oder einen Kommentar am Ende der Seite hinterlassen.

So. Genug Hierarchien auf Achsen angezeigt.
Das war’s für heute.
Bis demnächst!