
Beispiele für die Lösungsreihenfolge
Um die mögliche Komplexität der Lösungsreihenfolge zu veranschaulichen, beginnt die folgende Reihe von MDX-Abfragen mit zwei Abfragen, die einzeln betrachtet keine Probleme mit der Lösungsreihenfolge aufweisen. Sie werden dann in eine Abfrage kombiniert, für die eine Lösungsreihenfolge erforderlich ist.
Abfrage 1 – Differenzen zwischen Income und Expenses
Mit der ersten MDX-Abfrage sollen die Differenzen zwischen Einnahmen (Income) und Ausgaben (Expenses) für jedes Halbjahr ermittelt werden. Erstellen Sie dazu eine einfache MDX-Abfrage wie im folgenden Beispiel:
WITH
MEMBER [Time].[Year Difference] AS
[Time].[2nd half] - [Time].[1st half]
SELECT
{ [Account].[Income], [Account].[Expenses] } ON COLUMNS,
{ [Time].[1st half], [Time].[2nd half], [Time].[Year Difference] } ON ROWS
FROM Financials
Diese Abfrage enthält als einziges berechnetes Element Year Difference. Da nur ein berechnetes Element vorhanden ist, stellt die Lösungsreihenfolge kein Problem dar, vorausgesetzt der Cube verwendet keine berechneten Elemente.
Mit dieser MDX-Abfrage wird ein der folgenden Tabelle ähnelndes Resultset erstellt.
|
|
Income
|
Expenses
|
|---|
|
1st half
|
5000
|
4200
|
|
2nd half
|
8000
|
7000
|
|
Year Difference
|
3000
|
2800
|
Abfrage 2 – Prozentsatz von Net Income nach Abzug von Expenses
Mit der zweiten Abfrage soll der Prozentsatz des Nettoeinkommens (Net Income) nach Abzug der Ausgaben (Expenses) für jedes Halbjahr ermittelt werden. Verwenden Sie dazu die folgende MDX-Abfrage:
WITH
MEMBER [Account].[Net Income] AS
([Account].[Income], [Account].[Expenses]) / [Account].[Income]
SELECT
{ [Account].[Income], [Account].[Expenses], [Account].[Net Income] } ON COLUMNS,
{ [Time].[1st half], [Time].[2nd half] } ON ROWS
FROM Financials
Wie die vorherige MDX-Abfrage enthält auch diese nur ein berechnetes Element, Net Income, und muss daher keine Lösungsreihenfolge berücksichtigen.
Mit dieser MDX-Abfrage wird ein etwas anderes Resultset erstellt, ähnlich der folgenden Tabelle.
|
|
Income
|
Expenses
|
Net Income
|
|---|
|
1st half
|
5000
|
4200
|
0,16
|
|
2nd half
|
8000
|
7000
|
0,125
|
Der Grund für die unterschiedlichen Resultsets aus der ersten und der zweiten Abfrage ist eine andere Platzierung des berechneten Elements. In der ersten Abfrage ist das berechnete Element Teil der ROWS-Achse und nicht der COLUMNS-Achse, wie in der zweiten Abfrage. Diese unterschiedliche Platzierung gewinnt in der nächsten Abfrage an Bedeutung, wenn die beiden berechneten Elemente in einer einzigen MDX-Abfrage kombiniert werden.
Abfrage 3 – Kombinierte Berechnungen für Year Difference und Net Income
In dieser letzten Abfrage, in der die beiden vorherigen Beispiele in einer einzigen MDX-Abfrage kombiniert werden, wird die Lösungsreihenfolge wichtig. Um sicherzustellen, dass die Berechnungen in der richtigen Reihenfolge vorgenommen werden, definieren Sie diese Reihenfolge mithilfe des SOLVE_ORDER-Schlüsselworts.
Das SOLVE_ORDER-Schlüsselwort gibt die Lösungsreihenfolge der berechneten Elemente in einer MDX-Abfrage oder einem CREATE MEMBER-Befehl an. Die mit dem SOLVE_ORDER-Schlüsselwort verwendeten ganzzahligen Werte sind relativ, müssen nicht mit 0 beginnen und nicht aufeinander folgen. Der Wert weist MDX lediglich an, ein Element auf der Grundlage von Werten zu berechnen, die aus der Berechnung von Elementen mit einem höheren Wert abgeleitet sind. Wird ein berechnetes Element ohne das SOLVE_ORDER-Schlüsselwort definiert, lautet sein Standardwert 0.
Wenn Sie beispielsweise die in den ersten beiden Beispielabfragen verwendeten Berechnungen kombinieren, überschneiden sich die beiden berechneten Elemente Year Difference und Net Income in einer einzelnen Zelle im Resultdataset der MDX-Beispielabfrage. Nur anhand der Lösungsreihenfolge lässt sich bestimmen, wie Analysis Services diese Zelle auswertet. Die Formeln, mit denen diese Zelle erstellt wird, erzeugen je nach Lösungsreihenfolge der beiden berechneten Elemente unterschiedliche Ergebnisse.
Versuchen Sie zunächst, die in den ersten beiden Abfragen verwendeten Berechnungen in der folgenden MDX-Abfrage zu kombinieren:
WITH
MEMBER [Time].[Year Difference] AS
'[Time].[2nd half] - [Time].[1st half],
SOLVE_ORDER = 1
MEMBER [Account].[Net Income] AS
'([Account].[Income] - [Account].[Expenses]) / [Account].[Income]',
SOLVE_ORDER = 2
SELECT
{ [Account].[Income], [Account].[Expenses], [Account].[Net Income] } ON COLUMNS,
{ [Time].[1st half], [Time].[2nd half], [Time].[Year Difference] } ON ROWS
FROM Financials
In diesem kombinierten MDX-Abfragebeispiel hat Net Income die höchste Position in der Lösungsreihenfolge, hat also bei Interaktion der beiden Ausdrücke Vorrang. Analysis Services wertet die fragliche Zelle mithilfe der Net Income-Formel aus. Das Ergebnis dieser geschachtelten Berechnung ist in der folgenden Tabelle dargestellt.
|
|
Income
|
Expenses
|
Net Income
|
|---|
|
1st half
|
5000
|
4200
|
0,16
|
|
2nd half
|
8000
|
7000
|
0,125
|
|
Year Difference
|
3000
|
2800
|
0,066
|
Das Ergebnis in der freigegebenen Zelle basiert auf der Formel für Net Income. Analysis Services berechnet also das Ergebnis in der freigegebenen Zelle mit den Year Difference-Daten, wodurch folgende Formel erzeugt wird (das Ergebnis wurde zur besseren Übersicht gerundet):
((8000 - 5000) - (7000 - 4200)) / (8000 - 5000) = 0.066
oder
(3000 - 2800) / 3000 = 0.066
Wenn die Lösungsreihenfolge für die berechneten Elemente in der MDX-Abfrage vertauscht wird, berechnet Analysis Services das Ergebnis in der freigegebenen Zelle jedoch anders. Mit der folgenden kombinierten MDX-Abfrage wird die Lösungsreihenfolge für berechnete Elemente umgekehrt:
WITH
MEMBER [Time].[Year Difference] AS
'[Time].[2nd half] - [Time].[1st half],
SOLVE_ORDER = 2
MEMBER [Money].[Net Income] AS
'([Money].[Income] - [Money].[Expenses]) / [Money].[Income]',
SOLVE_ORDER = 1
SELECT
{ [Money].[Income], [Money].[Expenses], [Money].[Net Income] } ON COLUMNS,
{ [Time].[1st half], [Time].[2nd half], [Time].[Year Difference] } ON ROWS
FROM TestCube
Da die Reihenfolge der berechneten Elemente vertauscht wurde, verwendet Analysis Services zum Auswerten der Zelle die Year Difference-Formel, wie in der folgenden Tabelle gezeigt.
|
|
Income
|
Expenses
|
Net Income
|
|---|
|
1st half
|
5000
|
4200
|
0,16
|
|
2nd half
|
8000
|
7000
|
0,125
|
|
Year Difference
|
3000
|
2800
|
-0,035
|
Da in dieser Abfrage die Year Difference-Formel mit den Daten für Net Income verwendet wird, gleicht die Formel für die freigegebene Zelle der folgenden Berechnung:
((8000 - 7000) / 8000) - ((5000 - 4200) / 5000) = -0.035
- Oder -