Gegeben sei folgender Bericht:

Die Spalten werden hier übrigens dynamisch bestimmt durch einen MDX-Container, der wiederum von den Filtern Startjahr und Endjahr parametrisiert ist, wobei die Reihenfolge absteigend sein soll:

Order(<@Endjahr> : <@Startjahr>, [Jahr].[Jahr].CurrentMember.Name, DESC)

Diese Einsatzmöglichkeit von MDX-Containern ist für die meisten Anwender sicher nichts Neues mehr.

Nun sollen aber die Spalten auch nacheinander sortiert werden – also nicht nur nach einer Spalte sondern nach allen, die vorhanden sind.

Die Sortierung in Excel bringt folgendes Ergebnis:

Zunächst werden also alle Werte der Spalte 2016 absteigend sortiert, dann die der Spalte 2015 und zuletzt die übrigen Werte aus Spalte 2014.

Während es in Excel recht einfach ist, bei der Sortierung mehrere Spalten anzugeben, funktioniert das im Cockpit im Standard nicht. Es ist dort nur möglich, nach einer spalte gleichzeitig zu sortieren.

Um dies trotzdem zu erreichen, müssen wir einen Trick anwenden: die Werte der einzelnen Spalten werden in einer Sortierspalte mit unterschiedlicher Priorität zusammengesetzt.

Ein mögliches MDX dazu könnte so aussehen:

Sum
(
{<@Startjahr> : <@Endjahr>},
(100000 ^ Rank([Jahr].[Jahr].CurrentMember, {<@Startjahr> : <@Endjahr>}))
*
([Measures].[Wert], [Jahr].[Jahr].CurrentMember)
)

Das Ergebnis sieht schon mal vielversprechend aus:

Den MDX-Container kann man natürlich ausblenden:

Das Schöne an der Lösung ist, dass die Anzahl der Spalten theoretisch beliebig ist – und die Spalten nicht wie in Excel manuell hinzugefügt werden müssen.

Einschränkung:

  • Damit die Spalten sich eindeutig unterscheiden, werden die Werte potenziert. Dies hat natürlich Grenzen, somit ist die Anzahl der Spalten nicht zu groß zu wählen.
  • Ein weiteres Problem könnte dadurch entstehen, wenn sich Werte in einer Spalte extrem unterscheiden.

Diese möglichen Fälle muss man testen und kann ggf. durch eine Änderung der Basis (im Beispiel 100000) das gewünschte Ergebnis erzielen.

Denkbar wäre auch eine Lösung mit Strings, diese wäre aber noch komplizierter und die Performance wäre ebenfalls kritisch.