Author
others
View
14
Download
0
Embed Size (px)
HTW DresdenFakultät Informatik/MathematikProf. Dr.-Ing. A. Toll
Handbuch MDXArbeitsmaterial zur Lehrveranstaltung
Business Intelligence
3. überarbeitete Fassung, Dezember 2015
Impressum
Titel
Handbuch MDX – Arbeitsmaterial zur Lehrveranstaltung Business Intelligence
Herausgeber
Prof. Dr.-Ing. Axel TollHochschule für Technik und Wirtschaft DresdenFakultät Informatik/MathematikFriedrich-List-Platz 1D-01069 Dresden
AutorInnen
1. Fassung, Februar 2008 : Alexander Börner, Frank Eichholz, René Hegewald,Kerstin Leibling, Thomas Mattick, René Perske und Antje Richter unter derLeitung von Prof. Dr.-Ing. Axel Toll
2. überarbeitete Fassung, April 2010 : Alexander Börner, Prof. Dr.-Ing. Axel Toll
3. überarbeitete Fassung, Dezember 2015 : Dr. Annett Mölle, Prof. Dr.-Ing. Axel Toll
Dieses Handbuch richtet sich an
die Studiengänge Wirtschaftinformatik (Bachelor und Diplom) im 4. Semester undden Masterstudiengang Angewandte Informationstechnologien im 3. Semester derHTW Dresden.
Bild- und Textnachweis
Die Beispiele wurden erstellt mit MS SQL Server 2012 Analysis Services unterVerwendung der Multidimensional Expressions (MDX) - Referenz Link:https://msdn.microsoft.com/de-DE/library/ms145506(v=sql.120).aspx
Inhaltsverzeichnis
Tabellenverzeichnis VII
Abbildungsverzeichnis IX
1 Einführung in die Datenbanksprache MDX 11.1 Was ist MDX . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.2 Das Cube-Konzept . . . . . . . . . . . . . . . . . . . . . . . . 21.3 Der Beispiel-Cube Umsatz . . . . . . . . . . . . . . . . . . . . 31.4 MDX-Abfragen . . . . . . . . . . . . . . . . . . . . . . . . . . 51.5 Achseneinteilung . . . . . . . . . . . . . . . . . . . . . . . . . 61.6 Schreibweise in MDX-Abfragen . . . . . . . . . . . . . . . . . 7
2 Grundlagen 92.1 MDX Syntaxelemente . . . . . . . . . . . . . . . . . . . . . . 9
2.1.1 Eckige Klammern [ ] – Dimensions- und Membernamen 92.1.2 Punkte . – Trennzeichen . . . . . . . . . . . . . . . . . 92.1.3 Komma , - Trennzeichen . . . . . . . . . . . . . . . . . 102.1.4 Doppelpunkt : - Bereich . . . . . . . . . . . . . . . . . 102.1.5 Runde Klammern ( ) – Tupel . . . . . . . . . . . . . . 112.1.6 Geschwungene Klammern {} – Mengen / Sets . . . . . 13
2.2 MDX - Operatoren . . . . . . . . . . . . . . . . . . . . . . . . 13
3 Funktionen 173.1 Elementfunktionen . . . . . . . . . . . . . . . . . . . . . . . . 17
3.1.1 Ancestor . . . . . . . . . . . . . . . . . . . . . . . . . . 173.1.2 ClosingPeriod . . . . . . . . . . . . . . . . . . . . . . . 183.1.3 Cousin . . . . . . . . . . . . . . . . . . . . . . . . . . . 193.1.4 CurrentMember . . . . . . . . . . . . . . . . . . . . . 203.1.5 DataMember . . . . . . . . . . . . . . . . . . . . . . . 20
I
II Inhaltsverzeichnis
3.1.6 DefaultMember . . . . . . . . . . . . . . . . . . . . . . 213.1.7 FirstChild . . . . . . . . . . . . . . . . . . . . . . . . . 213.1.8 FirstSibling . . . . . . . . . . . . . . . . . . . . . . . . 223.1.9 Item . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233.1.10 Lag . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233.1.11 LastChild . . . . . . . . . . . . . . . . . . . . . . . . . 243.1.12 LastSibling . . . . . . . . . . . . . . . . . . . . . . . . 253.1.13 Lead . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253.1.14 LinkMember . . . . . . . . . . . . . . . . . . . . . . . 263.1.15 Members . . . . . . . . . . . . . . . . . . . . . . . . . 273.1.16 NextMember . . . . . . . . . . . . . . . . . . . . . . . 273.1.17 OpeningPeriod . . . . . . . . . . . . . . . . . . . . . . 283.1.18 ParallelPeriod . . . . . . . . . . . . . . . . . . . . . . . 283.1.19 Parent . . . . . . . . . . . . . . . . . . . . . . . . . . . 293.1.20 PrevMember . . . . . . . . . . . . . . . . . . . . . . . 293.1.21 StrToMember . . . . . . . . . . . . . . . . . . . . . . . 303.1.22 UnknownMember . . . . . . . . . . . . . . . . . . . . . 31
3.2 Numerische Funktion . . . . . . . . . . . . . . . . . . . . . . . 313.2.1 Aggregate . . . . . . . . . . . . . . . . . . . . . . . . . 313.2.2 Avg . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333.2.3 Correlation . . . . . . . . . . . . . . . . . . . . . . . . 343.2.4 Count . . . . . . . . . . . . . . . . . . . . . . . . . . . 353.2.5 Covariance . . . . . . . . . . . . . . . . . . . . . . . . 373.2.6 CovarianceN . . . . . . . . . . . . . . . . . . . . . . . 383.2.7 DistinctCount . . . . . . . . . . . . . . . . . . . . . . . 383.2.8 LinRegIntercept . . . . . . . . . . . . . . . . . . . . . 393.2.9 LinRegPoint . . . . . . . . . . . . . . . . . . . . . . . 403.2.10 LinRegR2 . . . . . . . . . . . . . . . . . . . . . . . . . 413.2.11 LinRegSlope . . . . . . . . . . . . . . . . . . . . . . . 413.2.12 LinRegVariance . . . . . . . . . . . . . . . . . . . . . . 423.2.13 Max . . . . . . . . . . . . . . . . . . . . . . . . . . . . 433.2.14 Median . . . . . . . . . . . . . . . . . . . . . . . . . . 443.2.15 Min . . . . . . . . . . . . . . . . . . . . . . . . . . . . 443.2.16 Ordinal . . . . . . . . . . . . . . . . . . . . . . . . . . 45
Inhaltsverzeichnis III
3.2.17 Rank . . . . . . . . . . . . . . . . . . . . . . . . . . . . 453.2.18 Stdev / Stddev . . . . . . . . . . . . . . . . . . . . . . 463.2.19 StdevP / StddevP . . . . . . . . . . . . . . . . . . . . 473.2.20 Sum . . . . . . . . . . . . . . . . . . . . . . . . . . . . 473.2.21 Value . . . . . . . . . . . . . . . . . . . . . . . . . . . 483.2.22 Var / Variance . . . . . . . . . . . . . . . . . . . . . . 493.2.23 VarP / VarianceP . . . . . . . . . . . . . . . . . . . . 49
3.3 Mengenfunktion . . . . . . . . . . . . . . . . . . . . . . . . . . 503.3.1 AllMembers . . . . . . . . . . . . . . . . . . . . . . . . 503.3.2 Ancestors . . . . . . . . . . . . . . . . . . . . . . . . . 513.3.3 Ascendants . . . . . . . . . . . . . . . . . . . . . . . . 523.3.4 Axis . . . . . . . . . . . . . . . . . . . . . . . . . . . . 533.3.5 BottomCount . . . . . . . . . . . . . . . . . . . . . . . 543.3.6 BottomPercent . . . . . . . . . . . . . . . . . . . . . . 543.3.7 BottomSum . . . . . . . . . . . . . . . . . . . . . . . . 553.3.8 Children . . . . . . . . . . . . . . . . . . . . . . . . . . 563.3.9 Crossjoin . . . . . . . . . . . . . . . . . . . . . . . . . 563.3.10 Descendants . . . . . . . . . . . . . . . . . . . . . . . . 583.3.11 Distinct . . . . . . . . . . . . . . . . . . . . . . . . . . 613.3.12 DrilldownMember . . . . . . . . . . . . . . . . . . . . 623.3.13 DrilldownMemberBottom . . . . . . . . . . . . . . . . 633.3.14 DrilldownMemberTop . . . . . . . . . . . . . . . . . . 643.3.15 DrillupLevel . . . . . . . . . . . . . . . . . . . . . . . . 653.3.16 Except . . . . . . . . . . . . . . . . . . . . . . . . . . . 653.3.17 Exists . . . . . . . . . . . . . . . . . . . . . . . . . . . 663.3.18 Filter . . . . . . . . . . . . . . . . . . . . . . . . . . . 673.3.19 Head . . . . . . . . . . . . . . . . . . . . . . . . . . . . 683.3.20 Hierarchize . . . . . . . . . . . . . . . . . . . . . . . . 683.3.21 LastPeriods . . . . . . . . . . . . . . . . . . . . . . . . 693.3.22 Members . . . . . . . . . . . . . . . . . . . . . . . . . 713.3.23 NameToSet . . . . . . . . . . . . . . . . . . . . . . . . 723.3.24 Order . . . . . . . . . . . . . . . . . . . . . . . . . . . 723.3.25 PeriodsToDate . . . . . . . . . . . . . . . . . . . . . . 733.3.26 Siblings . . . . . . . . . . . . . . . . . . . . . . . . . . 73
IV Inhaltsverzeichnis
3.3.27 StripCalculatedMembers . . . . . . . . . . . . . . . . . 743.3.28 StrToSet . . . . . . . . . . . . . . . . . . . . . . . . . . 743.3.29 Subset . . . . . . . . . . . . . . . . . . . . . . . . . . . 753.3.30 Tail . . . . . . . . . . . . . . . . . . . . . . . . . . . . 763.3.31 TopCount . . . . . . . . . . . . . . . . . . . . . . . . . 763.3.32 TopPercent . . . . . . . . . . . . . . . . . . . . . . . . 773.3.33 TopSum . . . . . . . . . . . . . . . . . . . . . . . . . . 783.3.34 Union . . . . . . . . . . . . . . . . . . . . . . . . . . . 783.3.35 VisualTotals . . . . . . . . . . . . . . . . . . . . . . . 79
3.4 Logische Funktionen . . . . . . . . . . . . . . . . . . . . . . . 803.4.1 IsAncestor . . . . . . . . . . . . . . . . . . . . . . . . . 803.4.2 IsGeneration . . . . . . . . . . . . . . . . . . . . . . . 813.4.3 IsLeaf . . . . . . . . . . . . . . . . . . . . . . . . . . . 813.4.4 IsSibling . . . . . . . . . . . . . . . . . . . . . . . . . . 82
3.5 Hierarchiefunktionen . . . . . . . . . . . . . . . . . . . . . . . 823.5.1 Hierarchy . . . . . . . . . . . . . . . . . . . . . . . . . 823.5.2 Dimension . . . . . . . . . . . . . . . . . . . . . . . . . 833.5.3 Dimensions . . . . . . . . . . . . . . . . . . . . . . . . 84
3.6 Zeichenfolgefunktionen . . . . . . . . . . . . . . . . . . . . . . 843.6.1 IIF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 843.6.2 LookupCube . . . . . . . . . . . . . . . . . . . . . . . 853.6.3 MemberToStr . . . . . . . . . . . . . . . . . . . . . . . 863.6.4 Name . . . . . . . . . . . . . . . . . . . . . . . . . . . 863.6.5 Properties . . . . . . . . . . . . . . . . . . . . . . . . . 873.6.6 UniqueName . . . . . . . . . . . . . . . . . . . . . . . 873.6.7 UserName . . . . . . . . . . . . . . . . . . . . . . . . . 88
4 Definitionsanweisungen 894.1 Definition berechneter Elemente . . . . . . . . . . . . . . . . 89
4.1.1 Einführung . . . . . . . . . . . . . . . . . . . . . . . . 894.1.2 Befehle zur Definition berechneter Elemente . . . . . . 894.1.3 Definieren mit WITH-Sektion in Abfragen . . . . . . . 894.1.4 Definition mittels CREATE MEMBER . . . . . . . . 91
Inhaltsverzeichnis V
5 Häufige Berechnungen und Select-Befehle 935.1 Filter- und Sortierfunktionen . . . . . . . . . . . . . . . . . . 935.2 Berechnung des prozentualen Anteils . . . . . . . . . . . . . . 945.3 Berechnung des einfachen Durchschnitts . . . . . . . . . . . . 965.4 Zeitbezug und Zeitraumberechnung . . . . . . . . . . . . . . . 97
5.4.1 Periode-zu-Periode Referenzierungen und Berechnungen 975.4.2 Laufender Durchschnitt und „52-Wochen-Hoch / -Tief“ 97
Literaturhinweise 101
Sachregister 103
Tabellenverzeichnis
1.1 Achsen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.1 Operatoren . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
3.1 Aggregations-Operatoren . . . . . . . . . . . . . . . . . . . . 323.2 Argumente für Descendants-Flag . . . . . . . . . . . . . . . . 61
4.1 Properties zum Definieren von berechneten Elementen . . . . 90
VII
Abbildungsverzeichnis
1.1 Aufbau des Beispiel-Cubes Umsatz . . . . . . . . . . . . . . 31.2 Dimensionshierarchien des Cubes Umsatz . . . . . . . . . . . 41.3 Erste MDX-Abfrage . . . . . . . . . . . . . . . . . . . . . . . 51.4 Eine MDX-Abfrage . . . . . . . . . . . . . . . . . . . . . . . 7
2.1 Bereich . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102.2 Tupel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122.3 Menge . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.1 Ancestor() . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183.2 ClosingPeriod() . . . . . . . . . . . . . . . . . . . . . . . . . 193.3 Cousin() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193.4 CurrentMember() . . . . . . . . . . . . . . . . . . . . . . . . 203.5 DataMember() . . . . . . . . . . . . . . . . . . . . . . . . . . 213.6 DefaultMember() . . . . . . . . . . . . . . . . . . . . . . . . 213.7 FirstChild() . . . . . . . . . . . . . . . . . . . . . . . . . . . 223.8 FirstSibling() . . . . . . . . . . . . . . . . . . . . . . . . . . 223.9 Item() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233.10 Lag() positiv . . . . . . . . . . . . . . . . . . . . . . . . . . . 243.11 Lag() negativ . . . . . . . . . . . . . . . . . . . . . . . . . . 243.12 LastChild() . . . . . . . . . . . . . . . . . . . . . . . . . . . 253.13 LastSibling() . . . . . . . . . . . . . . . . . . . . . . . . . . . 253.14 Lead() mit positivem Index . . . . . . . . . . . . . . . . . . 263.15 Lead() mit negativem Index . . . . . . . . . . . . . . . . . . 263.16 LinkMember() . . . . . . . . . . . . . . . . . . . . . . . . . . 273.17 Members() . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273.18 NextMember() . . . . . . . . . . . . . . . . . . . . . . . . . . 283.19 OpeningPeriod() . . . . . . . . . . . . . . . . . . . . . . . . . 28
IX
X Abbildungsverzeichnis
3.20 ParallelPeriod() . . . . . . . . . . . . . . . . . . . . . . . . . 293.21 Parent() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293.22 PrevMember() . . . . . . . . . . . . . . . . . . . . . . . . . . 303.23 StrToMember() . . . . . . . . . . . . . . . . . . . . . . . . . 303.24 UnknownMember() . . . . . . . . . . . . . . . . . . . . . . . 313.25 Aggregate() . . . . . . . . . . . . . . . . . . . . . . . . . . . 323.26 Avg() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343.27 Correlation() . . . . . . . . . . . . . . . . . . . . . . . . . . . 353.28 Count() Dimension . . . . . . . . . . . . . . . . . . . . . . . 353.29 Count() Hierarchieebenen . . . . . . . . . . . . . . . . . . . 363.30 Count() Menge . . . . . . . . . . . . . . . . . . . . . . . . . 363.31 Count() Tupel . . . . . . . . . . . . . . . . . . . . . . . . . . 373.32 Covariance() . . . . . . . . . . . . . . . . . . . . . . . . . . . 373.33 CovarianceN() . . . . . . . . . . . . . . . . . . . . . . . . . . 383.34 DistinctCount() . . . . . . . . . . . . . . . . . . . . . . . . . 393.35 LinRegIntercept() . . . . . . . . . . . . . . . . . . . . . . . . 403.36 LinRegPoint() . . . . . . . . . . . . . . . . . . . . . . . . . . 403.37 LinRegR2() . . . . . . . . . . . . . . . . . . . . . . . . . . . 413.38 LinRegSlope() . . . . . . . . . . . . . . . . . . . . . . . . . . 423.39 LinRegVariance() . . . . . . . . . . . . . . . . . . . . . . . . 433.40 Max() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 433.41 Median() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 443.42 Min() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 453.43 Ordinal() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 453.44 Rank() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 463.45 Stdev() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 473.46 StdevP() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 473.47 Sum() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 483.48 Value() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 493.49 Var() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 493.50 VarP() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 503.51 AllMembers() Hierarchie . . . . . . . . . . . . . . . . . . . . 513.52 Ancestors() . . . . . . . . . . . . . . . . . . . . . . . . . . . 523.53 Ascendants() . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
Abbildungsverzeichnis XI
3.54 Axis() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 533.55 BottomCount() . . . . . . . . . . . . . . . . . . . . . . . . . 543.56 BottomPercent() . . . . . . . . . . . . . . . . . . . . . . . . 553.57 BottomSum() . . . . . . . . . . . . . . . . . . . . . . . . . . 553.58 Children() . . . . . . . . . . . . . . . . . . . . . . . . . . . . 563.59 Crossjoin() . . . . . . . . . . . . . . . . . . . . . . . . . . . . 573.60 Descendants() mit Ebene und Abstand . . . . . . . . . . . . 583.61 Descendants() mit Element und Ebene . . . . . . . . . . . . 593.62 Descendants() mit BEFORE . . . . . . . . . . . . . . . . . . 603.63 Descendants() mit SELF_AND_BEFORE . . . . . . . . . . 603.64 Distinct() . . . . . . . . . . . . . . . . . . . . . . . . . . . . 623.65 DrilldownMember() nicht rekursiv . . . . . . . . . . . . . . . 633.66 DrilldownMember() rekursiv . . . . . . . . . . . . . . . . . . 633.67 DrilldownMemberBottom() . . . . . . . . . . . . . . . . . . . 643.68 DrilldownMemberTop() . . . . . . . . . . . . . . . . . . . . . 653.69 DrillupLevel() . . . . . . . . . . . . . . . . . . . . . . . . . . 653.70 Except() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 663.71 Exists() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 673.72 Filter() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 673.73 Head() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 683.74 Hierarchize() ohne POST . . . . . . . . . . . . . . . . . . . . 693.75 Hierarchize() mit POST . . . . . . . . . . . . . . . . . . . . 703.76 LastPeriods() . . . . . . . . . . . . . . . . . . . . . . . . . . 703.77 Members() Ebene . . . . . . . . . . . . . . . . . . . . . . . . 713.78 NameToSet() . . . . . . . . . . . . . . . . . . . . . . . . . . 723.79 Order() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 733.80 PeriodsToDate() . . . . . . . . . . . . . . . . . . . . . . . . . 733.81 Siblings() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 743.82 StripCalculatedMembers() . . . . . . . . . . . . . . . . . . . 743.83 StrToSet() . . . . . . . . . . . . . . . . . . . . . . . . . . . . 753.84 Subset() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 763.85 Tail() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 763.86 TopCount() . . . . . . . . . . . . . . . . . . . . . . . . . . . 773.87 TopPercent() . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
XII Abbildungsverzeichnis
3.88 TopSum() . . . . . . . . . . . . . . . . . . . . . . . . . . . . 783.89 Union() ohne doppelte Werte . . . . . . . . . . . . . . . . . 793.90 Union() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 793.91 VisualTotals() . . . . . . . . . . . . . . . . . . . . . . . . . . 803.92 IsAncestor() . . . . . . . . . . . . . . . . . . . . . . . . . . . 803.93 IsGeneration() . . . . . . . . . . . . . . . . . . . . . . . . . . 813.94 IsLeaf() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 823.95 IsSibling() . . . . . . . . . . . . . . . . . . . . . . . . . . . . 823.96 Hierarchy() . . . . . . . . . . . . . . . . . . . . . . . . . . . . 833.97 Dimension() . . . . . . . . . . . . . . . . . . . . . . . . . . . 833.98 Dimensions() . . . . . . . . . . . . . . . . . . . . . . . . . . . 843.99 IIF() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 853.100 LookupCube() . . . . . . . . . . . . . . . . . . . . . . . . . . 853.101 MemberToStr() . . . . . . . . . . . . . . . . . . . . . . . . . 863.102 Name() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 873.103 Properties() . . . . . . . . . . . . . . . . . . . . . . . . . . . 873.104 UniqueName() . . . . . . . . . . . . . . . . . . . . . . . . . . 883.105 Username() . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
4.1 Definieren berechneter Elemente mit WITH . . . . . . . . . 91
5.1 TopCount . . . . . . . . . . . . . . . . . . . . . . . . . . . . 945.2 Prozentualer Anteil einer Kategorie am Gesamtumsatz . . . 955.3 Prozentualer Umsatzanteil einer Subkategorie an der Kategorie 955.4 Durchschnitt . . . . . . . . . . . . . . . . . . . . . . . . . . . 965.5 Umsatzmengenänderung zum folgenden Quartal . . . . . . . 975.6 Laufender Durchschnitt 6 Perioden . . . . . . . . . . . . . . 985.7 Laufender Durchschnitt 6 Perioden . . . . . . . . . . . . . . 99
1 Einführung in dieDatenbanksprache MDX
1.1 Was ist MDX
MDX steht für Multidimensional Expressions (dt. Multidimensionale Aus-drücke) und ist eine weit verbreitete dimensionale Sprache, die bei Abfragenauf dimensionale Data Warehouses und Data Marts zugreift. Werkzeuge fürMDX sind z. B. die Microsoft SQL Server 2012 Analysis Services1, HyperionSystem 9 BI+ Analytic Services sowie Produkte von Applix, Microstrategy,MIS AG.
Ein Vergleich zwischen SQL und MDX liegt nahe. Beide Sprachen wurdenentwickelt, um spezielle Anfragen an Datenstrukturen zu richten. Jedochgleichen sich beide Sprachen nur darin, dass sie beide das AbfrageschemaSELECT . . . FROM . . . WHERE nutzen und ähnliche Basisoperatoren und –funktio-nen besitzen. Ein signifikanter Unterschied besteht darin, dass SQL ein ANSI-und ISO-Standard ist, wohingegen MDX eine Entwicklung von Microsoft istund erst noch in einen Industriestandard etabliert werden muss. Darüberhinaus besitzt MDX die Fähigkeit, Ausdrücke wie Hierarchien, Vorgänger,Nachfolger, Cousin usw. zu verstehen. Ebenfalls kann es Eigenschaften vonElementen und Zellen auslesen und definieren. Des Weiteren ist man mit MDXin der Lage, zwei- bis n-dimensionale Ergebnisse (Tabellen oder Cubes) zuerzeugen.
1Siehe Literaturhinweise S. 101
1
2 Kapitel 1 Einführung in die Datenbanksprache MDX
1.2 Das Cube-Konzept
Der Cube (dt. Datenwürfel2) ist eine Metapher zur Veranschaulichung desmultidimensionalen Datenraums, den ein Anwender zur Datenanalyse und-extraktion per MDX-Abfragen benutzt. Für die im Handbuch vorgestelltenAbfragen wird der Cube namens Umsatz verwendet, mit dem der Leser ausder Lehrveranstaltung Business Intelligence3 vertraut ist. Dieser Cube enthältgesammelte Informationen zu den Umsätzen eines Einzelhandelsunternehmens.
Generell besteht ein Cube aus mindestens zwei Dimensionen und mindes-tens einer Art von Measures (dt. Kennzahlen, Fakten). Jede Dimension ent-spricht einer unabhängigen Auswerterichtung im Analyseraum. Diese könnenspezifische Interessensbereiche des Unternehmens (z. B. Produkt, Mitarbeiter)abbilden oder allgemeingültige Inhalte betreffen (z. B. Dimension Zeit). JedeDimension besitzt Attribute. Attribute sind entweder voneinander unabhän-gig zu betrachtende Merkmale der Dimension oder werden in Hierarchienzusammengefasst. Bezogen auf die Dimension Produkt sind z. B. die AttributeName und Preis voneinander unabhängige Merkmale, während eine Attribut-Hierarchie namens Sortiment mit drei Ebenen – respektive Level – aus denAttributen Kategorie, Subkategorie und Name gebildet werden kann. Optionalexistiert die zusätzliche Ebene All, die alle Werte der untergeordneten Levelaggregiert.
Ein Elemente einer Hierarchie oder Ebene wird als Member bezeichnet.Brot, Hamburger und Joghurt sind z. B. Member der Ebene Subkategorie inder Dimension Produkt.
Eine besondere Dimension sind die sog. Measures, die eine Sammlung vonKennzahlen bzw. Fakten darstellen. Measures sind benannte, quantitativeAusdrücke, die durch Berechnen des Ausdrucks aufgelöst werden. Als Ergebniswird ein Wert in einem tabellarischen Modell zurückgeben.
2Der Cube spricht englisch und das hat sich auch für sein gesamtes Begriffe-Universumdurchgesetzt: Kennzahlen sind Measures, Ebenen sind Level, ...
3Siehe Literaturhinweise S. 101, Prof. A. Toll, Lehrveranstaltung Business Intelligence
1.3 Der Beispiel-Cube Umsatz 3
1.3 Der Beispiel-Cube UmsatzDieser Abschnitt soll die Struktur des Cubes Umsatz (Abb. 1.1) aus der Lehr-veranstaltung Business Intelligence4 detaillierter veranschaulichen. Der Cubewird in allen nachfolgenden Beispielen verwendet. Er weist die DimensionenProdukt, Mitarbeiter, Geografie und Zeit auf. Diese erlauben es, die Dateneines Einzelhandelsunternehmen hinsichtlich Produktpalette und organisa-torischer Struktur des Unternehmens sowie unter regionalen und zeitlichenAspekten zu analysieren. Jede Dimension besitzt Attribute, die sich in dreiHierarchieebenen anordnen lassen (Abb. 1.2). Die Dimension Produkt mit derHierarchie Sortiment enthält Angaben bis zur Ebene Produkt. Die DimensionMitarbeiter mit der Hierarchie Management enthält Angaben bis zur EbeneMitarbeiter. Die Dimension Geografie mit der Hierarchie Unternehmen enthältAngaben bis zur Ebene Bundesland. Die Dimension Zeit mit der HierarchieKalender enthält Angaben bis zur Ebene Monat.
Abbildung 1.1: Aufbau des Beispiel-Cubes Umsatz ohne die DimensionMitarbeiter. Auf den Kanten sind die Dimensionen Geo-grafie, Produkt und Zeit mit den jeweils drei Hierarchie-ebenen dargestellt. Die farbigen Teilwürfel symbolisierendie zugehörigen Kennzahlen (Measures).
4siehe Literaturhinweise S. 101
4 Kapitel 1 Einführung in die Datenbanksprache MDX
Abbildung 1.2: Die Dimensionen mit Hierarchien im Beispiel-Cube Um-satz. Die Datenanreicherung wurde mit Microsoft VisualStudio durchgeführt (vgl. Literaturhinweise auf S. 101)
1.4 MDX-Abfragen 5
1.4 MDX-Abfragen
Eine MDX-Abfrage ist eine in sich geschlossene Ausführung. Sie wird von vielenWerkzeugen, wie den hier verwendeten Microsoft SQL Server 2012 AnalysisServices5 automatisiert im Hintergrund ausgeführt, z. B. um OLAP Cubes ineiner grafischen Benutzeroberfläche darzustellen oder um Abfragen an einenCube zu stellen. Der Benutzer sitzt dabei an seinem Client und betrachtetDaten, welche als Säulen-, Linien- oder Kuchendiagramm dargestellt sind.Wenn er diese Daten dann genauer anzeigen will oder selektiert, generiert dasWerkzeug eine MDX-Abfrage und sendet diese an den Cube. Dieser stellt dieentsprechende Antwort zur Verfügung. Auch Excel vollzieht diese Aufgabe,wenn man eine Pivot-Tabelle benutzt, um Daten aus einem Würfel zu beziehen.
Stellen wir uns einen einfachen Cube mit dem Namen Umsatz vor, der dieDimension Zeit, Geografie, Produkt, Mitarbeiter und Measures (Kennzahlen)beinhaltet. Nun sind wir daran interessiert zu erfahren, wie hoch der Um-satzbetrag und die Umsatzmenge der ersten beiden Quartale des Jahres 2014waren. Hierfür dient uns die folgende Abfrage.
// Umsatzbetr äge und -mengen in den Quartalen 01/2014// und 02/2014 in SachsenSELECT
{[ Measures ].[ Umsatzbetrag ],[ Measures ].[ Umsatzmenge ]} ON COLUMNS ,
{[Zeit].[ Quartal ].&[201401],[Zeit].[ Quartal ].&[201402]} ON ROWS
FROM [ Umsatz ]WHERE {[ Geografie ].[ Sachsen ]}
Das Ergebnis wird als Pivot-Tabelle ausgegeben.
Abbildung 1.3: Erste MDX-Abfrage
Wie in dieser Abfrage ersichtlich ist benutzen wir SELECT, FROM und WHERE.Mithilfe der SELECT-Anweisung werden die Achsendimensionen beschrieben.
5vgl. Literaturhinweise S. 101
6 Kapitel 1 Einführung in die Datenbanksprache MDX
Diese beschreibt den Ergebnisraum, wobei jeder Dimension eine Rolle in Spal-ten (ON ROWS), Zeilen (ON COLUMNS) oder weiteren Achsen zugewiesen wird. Inunserem Fall werden die ersten beiden Quartale des Jahres 2014mit ON ROWS
den Zeilen zugeordnet und Umsatzbetrag sowie Umsatzmenge mit ON COLUMNS
den Spalten. Darüber hinaus werden innerhalb der SELECT–Anweisung eineMenge von Klassifikationsknoten (Member) ausgewählt, welche aus verschie-denen Hierarchien stammen können. Bei uns wurden dazu die Member Um-satzbetrag und Umsatzmenge aus der Dimension Measures ausgewählt, sowiedie beiden Quartale aus der Dimension Zeit. Durch die FROM–Anweisung wirdder Cube Umsatz bekannt gegeben, aus welchem die Daten stammen bzw.zu finden sind. Die WHERE–Klausel ist nur optional und kann genutzt werden,um den Ergebnisraum des zugrunde liegenden Cubes einzugrenzen. Hier kön-nen Dimensionen und deren Member, aber auch Measures eingesetzt werden.Mittels der WHERE–Anweisung findet in MDX echtes Slicing statt. Bei unsererAbfrage haben wir das Ergebnis auf die Region Sachsen eingegrenzt.
1.5 AchseneinteilungDie Achseneinteilung in MDX ist mit festgelegten Synonymen wie z. B. ON
ROWS oder ON COLUMNS möglich. In Tabelle 1.1 sind die Synonyme für die fünfam häufigsten benutzten Achsen aufgeführt.
Tabelle 1.1: Achsen und deren Synonyme in MXD.
Achse Synonym
0 On Columns1 On Rows2 On Pages3 On Chapter4 On Section
Theoretisch können mit MDX bis zu 128 Achsen eingeteilt werden. Diesgeschieht mit dem Ausdruck ON AXIS(n). Natürlich können auch Achsen, fürwelche Synonyme hinterlegt sind, mit ON AXIS(n) angesprochen werden. EineVermischung der Achsenbezeichnungen ist ebenfalls möglich. Zu beachtenist, dass Abfrageachsen nicht übersprungen werden dürfen. So muss eine
1.6 Schreibweise in MDX-Abfragen 7
MDX-Abfrage, welche die Achsennummerierung ON AXIS(1) benutzt, aucheine entsprechende Achse ON AXIS(0) bzw. das Alias ON COLUMNS benutzen.Auch eine SELECT-Klausel ohne Achsen, d. h. ein leerer SELECT-Ausdruck,ist zulässig. In diesem Fall erfolgt ein Slicing in allen Dimensionen und dieMDX-Abfrage wählt eine Zelle aus.
1.6 Schreibweise in MDX-Abfragen
Zum Abschluss der Einführung sollte noch erwähnt werden das MDX nichtcase-sensitiv ist. Auch das Layout einer Abfrage spielt keine Rolle. EineMDX-Abfrage ist standardmäßig so aufgestellt:
SELECT <Achsenspezifikation > ON COLUMNS ,<Achsenspezifikation > ON ROWS
FROM <cube_name >WHERE <slicing - Spezifikation >
Beispiel
SELECT{ ([ Geografie ].[ Bundesland ].[ Sachsen ]),
([ Geografie ].[ Bundesland ].[Thü ringen ])} ON COLUMNS ,{ ([Zeit].[ Kalender ].[ Quartal ]. AllMembers )} ON ROWSFROM [ Umsatz ]WHERE ([Zeit].[Jahr].&[2013], [ Measures ].[ Umsatzbetrag ]);
Abbildung 1.4: Eine MDX-Abfrage
Die SELECT-Anweisung wählt zum einen die Member Sachsen und Thüringendes Levels Bundesland der Achsendimension Geografie, zum anderen alleMember des Levels Quartal der Dimension Zeit. Bei der FROM-Klausel wird
8 Kapitel 1 Einführung in die Datenbanksprache MDX
der Cube Umsatz selektiert, aus dem die Daten bezogen werden. Die WHERE-Anweisung schränkt schließlich den Ergebnisraum auf den Verkaufsumsatz(Kennzahl Umsatzbetrag) ein, der im Jahr 2013 erwirtschaftet wurde.
2 Grundlagen
2.1 MDX Syntaxelemente
2.1.1 Eckige Klammern [ ] – Dimensions- undMembernamen
Die eckigen Klammern werden für alle Bezeichner und Werte (Member) genutztwie z. B. Dimensionen, Level (Ebene), Attribute, Measures (Kennzahlen,Fakten) usw. Bei allen Bezeichnungen, bei denen Zahlen, Leerzeichen, anderespezielle Zeichen oder Schlüsselwörter enthalten sind, sind eckige Klammernobligatorisch. Soll das Jahr 2013 als Member des Levels Jahr der DimensionZeit in einer MDX-Abfrage enthalten sein, muss es zwingend in eckige Klammereingefasst werden [2013], da der MDX-Parser diese Jahresangabe sonst nichtals Member, sondern als gewöhnliche Integer-Zahl interpretiert.
Beispiele für Bezeichner- und Wertangaben im Cube Umsatz
// Dimension :[Zeit]// Attribut :[ Quartal ]// Member[2013]// Wert ( immer mit "&" davor )&[201301]
2.1.2 Punkte . – Trennzeichen
Punkte werden eingesetzt, um eine Sammlung von Membern verschiedenerDimensionen in einem Abfrage-Tupel voneinander zu trennen. Ein Tupel istdie Kreuzung eines oder mehrerer Member, von denen jedes aus einer anderenDimension stammt. Ein einfaches Tupel ist zum Beispiel
9
10 Kapitel 2 Grundlagen
([ Produkt ].[ Subkategorie ].[ Bagels ])
oder auch
[ Measures ].[ Umsatzbetrag ]
2.1.3 Komma , - Trennzeichen
Tupel können Referenzen auf verschiedene Member beinhalten. Dabei wirdein Komma benötigt, um die Member voneinander zu trennen. Ein Beispiel
([ Produkt ].[ Subkategorie ].[ Bagels ],[ Geografie ].[ Staat ].[ Schweiz ])
2.1.4 Doppelpunkt : - Bereich
In jedem Level einer Dimension gibt es Member, die in einer speziellen Weisesortiert sind. Wenn es hier Sinn macht, kann man sich einen festgelegtenBereich von Membern ausgeben lassen. Dies ist mit dem SyntaxelementDoppelpunkt möglich. Dabei definieren der Anfangs-Member und der End-Member eines Levels den Bereich, getrennt durch einen Doppelpunkt.
SELECT{([Zeit].[ Kalender ].[ Quartal ].[1. Quartal ]) :
([Zeit].[ Kalender ].[ Quartal ].[4. Quartal ])} ON COLUMNS ,{([ Geografie ].[ Bundesland ].[ Sachsen ]),
([ Geografie ].[ Bundesland ].[Thü ringen ])} ON ROWSFROM [ Umsatz ]WHERE ([ Measures ].[ Umsatzbetrag ],[Zeit].[Jahr].&[2013]);
Abbildung 2.1: Bereich
Im Analysis Service ist es dabei irrelevant, in welcher Reihenfolge dasAnfangs- und das End-Member mit dem Bereichsoperator aufgeführt werden.Die Ergebnismenge legt die entsprechenden Member in der Reihenfolge dar,in der sie in der Datenbank abgelegt sind.
2.1 MDX Syntaxelemente 11
2.1.5 Runde Klammern ( ) – Tupel
Runde Klammern werden benutzt, um Tupel einzuschließen. Ein Tupel ist eineKombination aus Membern einer oder mehrerer Dimensionen. Ein einzelnerMember ist ein Tupel, wie z. B.[ Produkt ].[ Backwaren ]
Wenn ein Tupel aus mehr als einer Dimension besteht, darf es auch nureinen Member aus jeder Dimension besitzen. Um ein Tupel mit mehr als einerDimension zusammenzusetzen, müssen die Member mit runden Klammernumschlossen sein:([Zeit].[Jahr].[2013], [ Measures ].[ Umsatzbetrag ])
Ein Tupel stellt einen Schnitt (Slice) auf den Cube dar, wobei der Würfeldurch jedes einzelne Member des Tupels geschnitten wird. Ein Tupel kannnatürlich auch direkt in eine Abfrage auf den Cube eingebaut werden.SELECT
{([Zeit].[Jahr].[2013], [ Measures ].[ Umsatzbetrag ]),([Zeit].[Jahr].[2013], [ Measures ].[ Umsatzplan ])
} ON COLUMNS ,{([ Sortiment ].[ Produkt ]. Members )} ON ROWS
FROM [ Umsatz ]
Man hat somit die Möglichkeit der Feinkontrolle über die Kombinationvon Member und Ergebniszellen, die letztlich von der Abfrage zurückgegebenwerden.
Ein einzelner Member kann, muss aber nicht, in Klammern eingeschlossenwerden.
Es ist nicht möglich ein leeres Tupel zu erzeugen, da „()“ kein gültigesTupel ist. Hierfür gibt es beim Analysis Services 2012 die Möglichkeit, einNull-Member zu spezifizieren. Dieser wird mit (null) definiert.
Zusätzlich zur Möglichkeit, Tupel explizit mittels MDX-Code zu erzeugen,gibt es eine Reihe von Funktionen, welche Tupel als Rückgabewerte erzeugen.Die Dimensionalität eines Tupels hängt dabei stark von der Menge an Dimen-sionen ab, deren Member das Tupel zusammensetzen. Auch die Reihenfolge,in der die Dimensionen in einem Tupel erscheinen, spielt eine wichtige Rollefür die Dimensionalität des Tupels. Member aller Dimensionen können Teil
12 Kapitel 2 Grundlagen
Abbildung 2.2: Tupel
eines Tupels sein, d. h. auch Member der Measures-Dimension. Innerhalbeines Tupels kann aber kein weiteres Tupel genutzt werden.
// Ein Tupel kann das folgende Erscheinungsbild haben :(
[Zeit].[Jahr].[2013],{
[ Geografie ].[ Staat ].[ Deutschland ],[ Geografie ].[ Staat ].[ Schweiz ]
})// Die Schachtelung von Tupeln ist jedoch nicht zulässig;(
[Zeit].[Jahr].[2013],(
[ Geografie ].[ Staat ].[ Deutschland ],[ Geografie ].[ Staat ].[ Schweiz ]
))
2.2 MDX - Operatoren 13
2.1.6 Geschwungene Klammern {} – Mengen / Sets
Mithilfe von geschwungenen Klammern werden Mengen dargestellt. EineMenge ist eine Sammlung von Tupeln mit gleicher Dimensionalität. Die Mengedarf aus keinem, einem oder mehreren Tupeln bestehen. Eine Menge mit nullTupeln entspricht einer leeren Menge. In MDX darf eine Menge ein Tupelmehrfach enthalten. Darüber hinaus spielt die Reihenfolge eine signifikanteRolle. Ein Beispiel:
SELECT{([Zeit].[Jahr].[2013]), ([Zeit].[Jahr].[2014])}ON COLUMNS ,{[ Produkt ].[ Produktname ].[Danone - Vollmilch ],[ Produkt ].[ Produktname ].[Danone -Schoko - Milch ],[ Produkt ].[ Produktname ].[Danone - haltbare Milch ],[ Produkt ].[ Produktname ].[Danone - fettarme Milch ]}ON ROWS
FROM [ Umsatz ]
Abbildung 2.3: Menge
2.2 MDX - OperatorenIn MDX werden arithmetische, logische, Vergleichs-, Mengen-, Zeichenfolgen-und unäre Operatoren unterstützt. In Tabelle 2.1 sind die unterstütztenOperatoren beschrieben.
14 Kapitel 2 Grundlagen
Tabelle 2.1: MDX-Operatoren
Operator Funktion
I. Numerische Operatoren
+ Führt eine arithmetische Operation aus, die zwei Zahlen addiert.
– Führt eine arithmetische Operation aus, die eine Zahl von eineranderen subtrahiert.
* Führt eine arithmetische Operation aus, die zwei Zahlen multipli-ziert.
/ Führt eine arithmetische Operation aus, die zwei Zahlen dividiert.
% Dividiert den Wert des Kindes zum akkumulierten Wert und multi-pliziert das Ergebnis mit 100
^ Führt einen arithmetischen Vorgang aus, bei dem eine Zahl miteiner anderen Zahl potenziert wird.
II. Vergleichsoperatoren
< Führt eine Vergleichsoperation aus, die bestimmt, ob der Wert einesMDX-Ausdrucks kleiner als der Wert eines anderen MDX-Ausdrucksist.
<= Führt eine Vergleichsoperation aus, die bestimmt, ob der Werteines MDX-Ausdrucks kleiner oder gleich dem Wert eines anderenMDX-Ausdrucks ist.
<> Führt eine Vergleichsoperation aus, die bestimmt, ob der Wert einesMDX-Ausdrucks ungleich dem Wert eines anderen MDX-Ausdrucksist.
= Führt eine Vergleichsoperation aus, die bestimmt, ob der Wert einesMDX-Ausdrucks gleich dem Wert eines anderen MDX-Ausdrucksist.
> Führt eine Vergleichsoperation aus, die bestimmt, ob der Wert einesMDX-Ausdrucks größer als der Wert eines anderen MDX-Ausdrucksist.
>= Führt eine Vergleichsoperation aus, die bestimmt, ob der Werteines MDX-Ausdrucks größer oder gleich dem Wert eines anderenMDX-Ausdrucks ist.
III. Logische Operatoren
AND Führt eine logische Konjunktion zweier numerischer Ausdrücke aus.
[Fortsetzung auf nächster Seite. . . ]
2.2 MDX - Operatoren 15
Tabelle 2.1: . . . Fortsetzung
Operator Funktion
IS Führt einen logischen Vergleich zweier Objektausdrücke aus.
NOT Führt eine logische Negation eines numerischen Ausdrucks aus.
OR Führt eine logische Disjunktion zweier numerischer Ausdrücke aus.
XOR Führt eine logische Exklusion zweier numerischer Ausdrücke aus.
IV. Unäre Operatoren
– Führt eine unäre Operation aus, die den negativen Wert einesnumerischen Ausdrucks zurück gibt.
+ Führt eine unäre Operation aus, die den positiven Wert eines nu-merischen Ausdrucks zurück gibt.
V. Zeichenfolge-Operatoren
- - Zeigt vom Benutzer bereitgestellten Kommentartext an.
+ Führt eine Zeichenfolgenoperation aus, die mindestens zwei Zeichen-folgen, Tupel oder eine Kombination von Zeichenfolgen und Tupelnverkettet.
// Zeigt vom Benutzer eingegebenen Text an.
/*. . . */ Zeigt vom Benutzer bereitgestellten Kommentartext an.
VI. Mengenoperatoren
+ Führt eine Mengenoperation aus, die eine Vereinigungsmenge zweierMengen zurückgibt. Dabei werden doppelte Elemente entfernt.
* Führt eine Mengenoperation aus, die das Kreuzprodukt zweierMengen zurückgibt.
: Führt eine Mengenoperation aus, die eine natürlich geordnete Mengezurückgibt, wobei die beiden angegebenen Elemente als Endpunktedienen und alle Elemente zwischen den beiden angegebenen Ele-menten als Elemente der Menge eingeschlossen werden.
– Führt eine Mengenoperation aus, die die Differenzmenge zweierMengen zurückgibt. Dabei werden doppelte Elemente entfernt.
3 Funktionen
3.1 Elementfunktionen
3.1.1 Ancestor()
Die Funktion Ancestor gibt den Vorgänger des angegebenen Elements aufeiner angegebenen Ebene oder in einem angegebenen Abstand vom Elementzurückgibt.
Ancestor()-Syntax
// Level :Ancestor ( Member_Expression , Level_Expression )// Numeric :Ancestor ( Member_Expression , Distance )
Beispiel mit Levelangabe
SELECT {[ Geografie ].[ Bundesland ].&[13]} ON COLUMNS ,Ancestor ([ Produkt ].[ Sortiment ].[ Produkt ].
[ Friedrichs - Pumpernickel Brot],[ Produkt ].[ Sortiment ].[ Subkategorie ]) ON ROWS
FROM [ Umsatz ]
Als Ergebnis wird das Element Brot ausgegeben, da es in der Ebene Subka-tegorie liegt und das Vorgängerelement von Friedrichs–Pumpernickel Brot ist(Abb. 3.1a).
Beispiel mit Distanzangabe
SELECT {[ Geografie ].[ Bundesland ].&[13]} ON COLUMNS ,Ancestor ([ Produkt ].[ Sortiment ].[ Produkt ].
[ Friedrichs - Pumpernickel Brot], 2) ON ROWSFROM [ Umsatz ]
17
18 Kapitel 3 Funktionen
Beim Beispiel mit Distanzangabe erhält man als Ergebnis das ElementBackwaren, da es zwei Ebenen über Friedrichs - Pumpernickel Brot liegt unddessen Vorgänger Element ist (Abb. 3.1b).
Abbildung 3.1: Ancestor() mit Level- (links) und Distanzangabe (rechts)
3.1.2 ClosingPeriod()
Die Funktion ClosingPeriod gibt das letzte gleichgeordnete Element unterden nachfolgenden Werten eines angegebenen Elements auf einer angegebenenEbene zurück. ClosingPeriod ist hauptsächlich zur Verwendung mit einerDimension des Typ Zeit gedacht, es kann jedoch auch mit beliebigen anderenDimensionen verwendet werden.
ClosingPeriod()-Syntax
ClosingPeriod ([ Level_Expression [, Member_Expression ] ])
Wenn nur ein Ebenenausdruck verwendet wird, gibt die ClosingPeri-
od-Funktion den Standardwert des letzten gleichgeordneten Elements derangegeben Ebene zurück. Wenn ein Ebenenausdruck sowie ein Elementaus-druck angegeben werden, gibt die ClosingPeriod-Funktion den Standard-wert des letzten gleichgeordneten Elements unter den nachfolgenden Wertendes angegeben Elements auf der angegeben Ebene zurück. Wenn weder einEbenenausdruck noch ein Elementausdruck angegeben ist, verwendet dieClosingPeriod-Funktion Standardebene und -element der Dimension vomTyp Zeit (sofern vorhanden) im Cube.
Beispiel mit Ebenenausdruck und Elementausdruck
SELECT ClosingPeriod ([Zeit].[ Kalender ].[ Monat ],[Zeit].[ Kalender ].[Jahr].&[2013]) ON COLUMNS
FROM [ Umsatz ]
Im Beispiel mit Ebenen- und Elementausdruck (Abb. 3.2a) wird der Stan-dardmeasure des Monats Dezember für das Jahr 2013 ausgegeben, da dieserdas letzte gleichgeordnet Element in der Ebene Monat ist.
3.1 Elementfunktionen 19
Beispiel mit Ebenenausdruck
SELECT ClosingPeriod ([Zeit].[ Kalender ].[ Quartal ]) ON COLUMNSFROM [ Umsatz ]
Im Beispiel mit Ebenenausdruck (Abb. 3.51b) wird der Standardmeasuredes letzten Elements der Ebene Quartal ausgegeben, d.h. das 4. Quartal 2014,da es das letzte gleichgeordnet Element in der Ebene Quartal ist.
Abbildung 3.2: ClosingPeriod() mit Ebenenausdruck und Elementaus-druck (links) bzw. Ebenenausdruck allein (rechts)
3.1.3 Cousin()
Die Funktion Cousin gibt das untergeordnete Element mit derselben relati-ven Position unter seinem übergeordneten Element an, wie das angegebeneuntergeordnete Element zu seinem übergeordneten Element.
Cousin()-Syntax
Cousin ( Member_Expression , Ancestor_Member_Expression )
Beispiel
SELECT Cousin ([ Produkt ].[ Sortiment ].[ Produkt ].[ Golden Toast - Bagels ],
[ Produkt ].[ Sortiment ].[ Subkategorie ].[Brot]) ON COLUMNS ,{[ Measures ].[ Umsatzbetrag ]} ON ROWS
FROM [ Umsatz ]
Bei diesem Beispiel wird das Element Colonial – Roggenbrot ausgegeben.Dies geschieht, weil es die selbe relative Position unter seinem Elternelementbesitzt wie das Element Golden Toast - Bagels.
Abbildung 3.3: Cousin()
20 Kapitel 3 Funktionen
3.1.4 CurrentMember()
Die Funktion CurrentMember gibt das aktuelle Element entlang einer angege-benen Hierarchie während einer Iteration zurück.
CurrentMember()-Syntax
Hierarchy_Expression . CurrentMember
Beispiel
WITH MEMBER [ Measures ].[ Current Produkt ] AS[ Produkt ].[ Sortiment ]. CurrentMember .Name
SELECT[ Measures ].[ Currentprodukt ] ON COLUMNS ,[ Produkt ].[ Sortiment ].[ Subkategorie ]. Members ON ROWS
FROM [ Umsatz ]
Abbildung 3.4: CurrentMember()
3.1.5 DataMember()
Die Funktion DataMember gibt das systemgenerierte Datenelement zurück,das einem Nicht-Blattelement einer Dimension zugeordnet ist.
3.1 Elementfunktionen 21
DataMember()-Syntax
Member_Expression . DataMember
Beispiel
SELECT [ Produkt ].[ Preis ].&[3.94]. DataMember ON COLUMNSFROM [ Umsatz ]
Abbildung 3.5: DataMember()
3.1.6 DefaultMember()
Wenn man DefaultMember verwendet wird das Standardelement einer Hier-archie zurückgegeben.
DefaultMember()-Syntax
Hierarchy_Expression . DefaultMember
Beispiel
SELECT [Zeit].[ Quartal ]. DefaultMember ON COLUMNSFROM [ Umsatz ]
Abbildung 3.6: DefaultMember()
3.1.7 FirstChild()
Die Funktion FirstChild gibt das erste untergeordnete Element der angege-benen Ebene zurück. Die Reihenfolge der Elemente entspricht der Datenablageim Cube.
FirstChild()-Syntax
Member_Expression . FirstChild
22 Kapitel 3 Funktionen
Beispiel
SELECT{[ Geografie ].[ Region ].&[ Deutschland Ost]} ON COLUMNS ,{[ Produkt ].[ Sortiment ].[ Subkategorie ].[ Feinkostfleisch ].FirstChild } ON ROWS
FROM [ Umsatz ]
Als Ergebnis dieser Abfrage erhalten wir das Element American – geschnit-tenes Hühnchen, da es das erste Element in der Subkategorie Feinkostfleischist.
Abbildung 3.7: FirstChild()
3.1.8 FirstSibling()
Bei FirstSibling wird das erste untergeordnete Element für das übergeord-nete Element eines Elements zurückgegeben.
FirstSibling()-Syntax
Member_Expression . FirstSibling
Beispiel
SELECT{[ Geografie ].[ Region ].&[ Deutschland Ost]} ON COLUMNS ,{[Zeit].[Jahr].&[2014]. FirstSibling } ON ROWS
FROM [ Umsatz ]
Es wird das Jahr 2013 zurückgegeben, da es das erste untergeordneteElement der Ebene Jahr ist.
Abbildung 3.8: FirstSibling()
3.1 Elementfunktionen 23
3.1.9 Item()
Die Funktion Item gibt ein ausgewähltes Element aus dem angegebenen Tupelzurück. Die Zählweise beginnt wie bei einem Array mit 0.
Item()-Syntax
Tuple_Expression .Item( Index )
Beispiel
SELECT [ Measures ].[ Umsatzbetrag ] ON COLUMNS ,([ Geografie ].[ Bundesland ].&[01],
[ Produkt ].[ Sortiment ].[ Subkategorie ].&[001]. Children ).Item (2) ON ROWS
FROM Umsatz
Es wird hier das dritte Element des Tupels ausgegeben.
Abbildung 3.9: Item()
3.1.10 Lag()
Die Funktion Lag gibt das Element zurück, welches die angegebene Anzahlvon Positionen vor dem angegebenen Element auf der Ebene liegt. Wenn derangegebene Abstand 0 beträgt, gibt die Lag-Funktion das angegebene Elementselbst zurück. Wenn der angegebene Abstand negativ ist, gibt die Lag-Funktionein nachfolgendes Element zurück. Lag(1) entspricht derPrevMember-Funktion(Abschnitt 3.1.20) und Lag(-1) entspricht der NextMember-Funktion (Abschnitt3.1.16).
Lag()-Syntax
Member_Expression .Lag( Index )
Beispiel mit positivem Index
SELECT ([ Measures ].[ Umsatzbetrag ]) ON COLUMNS ,[ Produkt ].[ Sortiment ].[ Subkategorie ].&[005].Lag (2) ON ROWSFROM Umsatz
24 Kapitel 3 Funktionen
Es wird hier das Element Feinkostfleisch zurückgegeben, weil es zwei Stellenvor dem ausgewählten Element steht.
Abbildung 3.10: Lag() positiv
Beispiel mit negativem Index
SELECT [ Measures ].[ Umsatzbetrag ] ON COLUMNS ,[ Produkt ].[ Sortiment ].[ Subkategorie ].&[005].Lag ( -1) ON ROWSFROM Umsatz
Es wird hier das Element Hamburger zurückgegeben, weil es eine Stellennach dem ausgewählten Element steht.
Abbildung 3.11: Lag() negativ
3.1.11 LastChild()
Die Funktion LastChild gibt das letzte untergeordnete Element der angege-benen Ebene zurück. Die Reihenfolge der Elemente ist, sowie sie im Cubeangelegt wurden.
LastChild()-Syntax
Member_Expression . LastChild
Beispiel
SELECT{[ Geografie ].[ Region ].&[ Deutschland Ost]} ON COLUMNS ,{[ Produkt ].[ Sortiment ].[ Subkategorie ].[ Feinkostfleisch ].LastChild } ON ROWS
FROM [ Umsatz ]
Als Ergebnis erhält man bei dieser Abfrage das Element Meica – geschnitte-nes Hühnchen, da dies das letzte Element in der Subkategorie Feinkostfleischist.
3.1 Elementfunktionen 25
Abbildung 3.12: LastChild()
3.1.12 LastSibling()
Die Funktion LastSibling gibt das letzte untergeordnete Element des über-geordneten Elements eines angegebenen Elements zurück.
LastSibling()-Syntax
Member_Expression . LastSibling
Beispiel
SELECT{[ Geografie ].[ Region ].&[ Deutschland Ost]} ON COLUMNS ,{[Zeit].[Jahr].&[2013]. LastSibling } ON ROWS
FROM [ Umsatz ]
Es wird das Jahr 2014 zurückgegeben, da es das letzte untergeordneteElement des Elements Jahr ist.
Abbildung 3.13: LastSibling()
3.1.13 Lead()
Die Lead-Funktion gibt das Element zurück, welches die angegebene Anzahlvon Positionen hinter dem angegebenen Element entlang der Ebene steht.
Lead()-Syntax
Member_Expression .Lead( Index )
Beispiel mit positivem Index
SELECT [ Measures ].[ Umsatzbetrag ] ON COLUMNS ,[ Produkt ].[ Sortiment ].[ Subkategorie ].&[005].Lead (2) ON ROWSFROM Umsatz
26 Kapitel 3 Funktionen
Es wird hier das Element Hot Dogs zurückgegeben, weil es zwei Stellenhinter dem ausgewählten Element steht.
Abbildung 3.14: Lead() mit positivem Index
Beispiel mit negativem Index
SELECT [ Measures ].[ Umsatzbetrag ] ON COLUMNS , [ Produkt ].[ Sortiment ].[ Subkategorie ].&[005].Lead ( -2) ON ROWS
FROM Umsatz
Es wird hier das Element Feinkostfleisch zurückgegeben, weil es zwei Stellenvor dem ausgewählten Element steht.
Abbildung 3.15: Lead() mit negativem Index
3.1.14 LinkMember()
Die Funktion LinkMember gibt das Element zurück, das in einer angegebenenHierarchie gleichbedeutend mit dem angegebenen Element ist.
LinkMember()-Syntax
LinkMember ( Member_Expression , Hierarchy_Expression )
Beispiel
SELECT Ascendants ( LinkMember ([ Produkt ].[ Produkt ].[Colonial - Bagels ], [ Produkt ].[ Sortiment ])) ON COLUMNS ,{[ Measures ].[ Umsatzbetrag ]} ON ROWS
FROM Umsatz
Die Funktion LinkMember gibt in diesem Beispiel den Schlüsselwert desElements Colonial – Bagels aus der Hierachie Sortiment an die FunktionAscendants. Die Ascendants-Funktion ist für die hier gezeigte Ausgabe ver-antwortlich. Informationen zu Ascendants sind in Abschnitt 3.3.3 auf Seite52 zu finden.
3.1 Elementfunktionen 27
Abbildung 3.16: LinkMember()
3.1.15 Members()
Die Funktion Members gibt einen durch eine Zeichenfolgeausdruck angegebenesElement zurück.
Members()-Syntax
Members ( Member_Name )
Beispiel
SELECT{[ Geografie ].[ Region ].&[ Deutschland Ost]} ON COLUMNS ,Members (" Bagels ") ON ROWS
FROM [ Umsatz ]
Die Funktion Members sucht in diesem Beispiel im gesamten Cube nachdem String Bagels und gibt ihn aus.
Abbildung 3.17: Members()
3.1.16 NextMember()
Bei NextMember wird das nächste Element in der Ebene zurückgegeben.
NextMember()-Syntax
Member_Expression . NextMember
Beispiel
SELECT {[ Geografie ].[ Bundesland ].&[01]} ON COLUMNS ,{([Zeit].[Jahr].[2013],[Zeit].[ Quartal ].[1. Quartal ]. NextMember )} ON ROWS
FROM [ Umsatz ]
28 Kapitel 3 Funktionen
Es wird in diesem Beispiel das 2. Quartal 2013 ausgegeben, da es dasnachfolge Element des 1. Quartals ist.
Abbildung 3.18: NextMember()
3.1.17 OpeningPeriod()
Die OpeningPeriod-Funktion gibt das erste gleichgeordnete Element unterden nachfolgenden Werten auf einer angegebenen Ebene zurück, optional fürein angegebenes Element.
OpeningPeriod()-Syntax
OpeningPeriod ([ Level_Expression [, Member_Expression ] ])
Beispiel
SELECT OpeningPeriod ([Zeit].[ Kalender ].[ Monat ],[Zeit].[ Kalender ].[ Quartal ].&[201403]) ON COLUMNS
FROM [ Umsatz ]
Das Element Juli wird angezeigt, da es das erste gleichgeordnet Element inder Hierarchie Monat unter dem 3. Quartal von 2014 ist.
Abbildung 3.19: OpeningPeriod()
3.1.18 ParallelPeriod()
Diese Funktion gibt ein Element aus einer früheren Periode in derselbenrelativen Position wie das angegebene Element zurück.
ParallelPeriod()-Syntax
ParallelPeriod ([ Level_Expression [, Index [,Member_Expression ] ] ])
3.1 Elementfunktionen 29
Beispiel
SELECT ParallelPeriod ([Zeit].[ Kalender ].[ Quartal ], 2,[Zeit].[ Kalender ].[ Monat ].&[201309]) ON COLUMNS
FROM [ Umsatz ]
In diesem Beispiel wird basierend auf der Quartalebene die parallele Periodefür den Monat September 2013 zurückgegeben, die zwei Perioden zurückliegt,d. h. März 2013.
Abbildung 3.20: ParallelPeriod()
3.1.19 Parent()
Mit Parent wird das übergeordnete Element eines Elements zurück gegeben.
Parent()-Syntax
Member_Expression . Parent
Beispiel
SELECT{[ Geografie ].[ Region ].&[ Deutschland Ost]} ON COLUMNS ,{[Zeit].[ Kalender ].[ Quartal ].[1. Quartal ]. Parent } ON ROWS
FROM [ Umsatz ]
Es wird das Element Jahr 2013 ausgeben da es das übergeordnete Elementdes Elements 1. Quartal ist.
Abbildung 3.21: Parent()
3.1.20 PrevMember()
Die Funktion PrevMember gibt das vorherige Element in der Ebene zurück,die das angegebene Element enthält.
30 Kapitel 3 Funktionen
PrevMember()-Syntax
Member_Expression . PrevMember
Beispiel
SELECT {[ Geografie ].[ Bundesland ].&[01]} ON COLUMNS ,{([Zeit].[Jahr].[2013], [Zeit].[ Quartal ].[2. Quartal ]. PrevMember )} ON ROWS
FROM [ Umsatz ]
Es wird in diesem Beispiel das 1. Quartal des Jahres 2013 ausgegeben, dadieses das Vorgänger-Element des 2. Quartals 2013 ist.
Abbildung 3.22: PrevMember()
3.1.21 StrToMember()
Diese String-Funktion gibt das durch eine Zeichenfolge im MDX-Formatangegebene Element zurück.
StrToMember()-Syntax
StrToMember ( Member_Name [, CONSTRAINED ])
Beispiel
SELECT StrToMember ("Ost") ON COLUMNS ,{([Zeit].[Jahr].[2013], [Zeit].[ Quartal ].[2. Quartal ])}ON ROWS
FROM [ Umsatz ]
Die Funktion StrToMember nimmt das erste Element im Cube, welches aufden String passt und gibt dieses aus.
Abbildung 3.23: StrToMember()
3.2 Numerische Funktion 31
3.1.22 UnkownMember()
Die UnkownMember-Funktion gibt das einer Ebene oder eines Element zuge-ordnete unbekannte Element zurück.
UnknownMember()-Syntax
// Element :Member_Expression . UnknownMember// Hierarchie :Hierarchy_Expression . UnknownMember
Beispiel mit Hierarchie
SELECT[ Produkt ].[ Sortiment ].[All]. UnknownMember ON COLUMNS ,{([Zeit].[Jahr].[2013], [Zeit].[ Quartal ].[2. Quartal ])}ON ROWS
FROM [ Umsatz ]
Es wird das unbekannte Element der Produkt-Hierarchie Sortiment ausge-ben.
Abbildung 3.24: UnknownMember()
3.2 Numerische Funktion
3.2.1 Aggregate()
Die Funktion Aggregate gibt eine Zahl zurück, die durch Aggregieren überdie vom Mengenausdruck zurückgegebenen Zellen berechnet wird. Wenn keinnumerischer Ausdruck angegeben wird, aggregiert die Funktion jedes Measureim aktuellen Abfragekontext mit dem für jedes Measure definierten Standard-aggregationsoperator. Wenn ein numerischer Ausdruck angegeben wird, wertetdie Funktion zuerst den numerischen Ausdruck für jede Zelle in der angegebe-nen Menge aus und summiert dann die Werte. Die Aggregationsoperatorensind in Tabelle 3.1 erläutert.
32 Kapitel 3 Funktionen
Aggregate()-Syntax
Aggregate ( Set_Expression [, Numeric_Expression ])
Beispiel
WITH MEMBER [ Geografie ].[ Bundesland ].[ Aggregate ] ASAggregate ({[ Geografie ].[ Bundesland ].&[15],
[ Geografie ].[ Bundesland ].&[16]})SELECT
[Zeit].[ Kalender ].[ Quartal ].&[201303] ON COLUMNS ,{[ Produkt ].[ Subkategorie ].[ Bagels ] :[ Produkt ].[ Subkategorie ].[ Feinkostfleisch ]} ON ROWS
FROM [ Umsatz ]WHERE [ Geografie ].[ Bundesland ].[ Aggregate ]
Abbildung 3.25: Aggregate()
Tabelle 3.1: Aggregations-Operatoren
Operator Ergebnis
Sum Gibt die Summe der Werte über die Menge zurück.
Count Gibt die Anzahl der Werte über die Menge zurück.
Max Gibt den Maximalwert über die Menge zurück.
Min Gibt den Minimalwert über die Menge zurück.
SemiadditiveAgg.-Fkt.
Gibt die Berechnung von semiadditivem Verhalten über dieMenge nach dem Projizieren der Form auf die Zeitachse zu-rück.
[Fortsetzung auf nächster Seite. . . ]
3.2 Numerische Funktion 33
Tabelle 3.1: . . . Fortsetzung
Operator Ergebnis
Distinct Count Aggregiert über die zum Teilcube beitragenden Faktendaten,wenn die Slicerachse eine Menge enthält. Gibt ein DistinctCount-Measure für jedes Element der Menge zurück. DasErgebnis hängt von der Sicherheit der aggregieren Zellen undnicht von der Sicherheit der Zellen, die für die Berechnung er-forderlich sind, ab. Die Zellensicherheit für die Menge generierteinen Fehler. Die Zellensicherheit unterhalb der Granularitätder angegebenen Menge wird ignoriert. Berechnungen auf derMenge generieren einen Fehler. Berechnungen unterhalb derGranularität der Menge werden ignoriert. Ein Distinct Countüber eine Menge, die ein Element und mindestens ein unterge-ordnetes Element enthält, gibt den Distinct Count über zumuntergeordneten Element beitragende Fakten zurück.
Nicht aggregier-bare Attribute
Gibt die Summe der Werte zurück.
Gemischte Agg.-Fkt.
Nicht unterstützt, lösen einen Fehler aus.
Unäre Operato-ren
Nicht berücksichtigt. Die Werte werden durch Summierenaggregiert.
BerechneteMeasures
Festgelegte Lösungsreihenfolge, um sicherzustellen, dass dasberechnete Measure gilt.
Berechnete Ele-mente
Die üblichen Regeln gelten, d. h., die letzte Lösungsreihenfolgehat Vorrang.
Zuweisungen Zuweisungen werden entsprechend der Aggregationsfunktiondes Measures aggregiert. Ist die Aggregationsfunktion desMeasures Distinct Count, werden die Zuweisungen summiert.
3.2.2 Avg()
Die Funktion Avg wertet eine Menge aus und gibt den Durchschnitt der nichtleeren Werte in der Menge zurück, gemittelt über die Measures in der Mengeoder über ein angegebenes Measure. Wird eine Menge von leeren Tupeln odereine leere Menge angegeben, gibt die Avg-Funktion einen leeren Wert zurück.
34 Kapitel 3 Funktionen
Avg()-Syntax
Avg( Set_Expression [, Numeric_Expression ])
Beispiel
WITH MEMBER Measures .[Avg Umsatzbetrag ] ASAvg(
{([ Produkt ].[ Sortiment ].[ Subkategorie ].[ Milch ]),([ Produkt ].[ Sortiment ].[ Subkategorie ].
[ frisches Schweinefleisch ]),([ Produkt ].[ Sortiment ].[ Subkategorie ].[ Bagels ])},([ Measures ].[ Umsatzbetrag ]))
SELECT Measures .[Avg Umsatzbetrag ] ON COLUMNS ,{([Zeit].[ Kalender ].[Jahr].[2014])} ON ROWS
FROM [ Umsatz ]
Abbildung 3.26: Avg()
3.2.3 Correlation()
Correlation gibt den Korrelationskoeffizienten des X-Y-Wertepaares zurück,die von einer Menge ausgewertet wurden.
Correlation()-Syntax
Correlation ( Set_Expression , Numeric_Expression_y [,Numeric_Expression_x ])
Beispiel
WITH MEMBER Measures .[ Correlation ] ASCorrelation (
[ Produkt ].[ Sortiment ].[ Subkategorie ].[ Bagels ].Children ,[ Measures ].[ Umsatzbetrag ],[ Measures ].[ Umsatzplan ])
SELECT Measures .[ Correlation ] ON COLUMNS ,{[ Geografie ].[ Staat ].&[ Deutschland ],[ Geografie ].[ Staat ].&[Ö sterreich ],[ Geografie ].[ Staat ].&[ Schweiz ]} ON ROWS
FROM [ Umsatz ]
3.2 Numerische Funktion 35
Man erhält bei diesem Beispiel den Korrelationskoeffizenten der drei LänderDeutschland, Österreich und Schweiz.
Abbildung 3.27: Correlation()
3.2.4 Count()
Mit der Funktion Count kann man die Anzahl der Hierarchien in einem Cube,die Anzahl der Ebenen in der Hierarchie, die Anzahl der Zellen in einer Mengeoder die Anzahl der Dimensionen in einem Tupel ermitteln.
Count()-Syntax
// Dimension :Dimensions . Count
// Hierarchie :Hierarchy_Expression . Levels . Count
// Menge :Set_Expression . Count
// oderCount ( Set_Expression [, ( EXCLUDEEMPTY | INCLUDEEMPTY ) ])
// Tupel :Tuple_Expression . Count
Mit der folgenden Abfrage wird die Anzahl der Dimensionen ermittelt.
Beispiel mit Dimension
WITH MEMBER [ Measures ].[ Count_dim ] AS Dimensions . countSELECT [ Measures ].[ Count_dim ] ON COLUMNSFROM [ Umsatz ]
Abbildung 3.28: Count() mit Dimension
36 Kapitel 3 Funktionen
Als Ergebnis der nächsten Abfrage wird die Anzahl der Hierarchieebenenzurückgegeben.
Beispiel mit Hierarchieebenen
WITH MEMBER [ Measures ].[ Count_hier ] AS[ Produkt ].[ Sortiment ]. Levels . count
SELECT [ Measures ].[ Count_hier ] ON COLUMNSFROM [ Umsatz ]
Abbildung 3.29: Count() mit Hierarchieebenen
Die folgende Abfrage ermittelt die Anzahl der Kind-Elemente der MengeMilch.
Beispiel mit Menge
WITH MEMBER Measures .[ Anzahl ] AS[ Produkt ].[ Sortiment ].[ Subkategorie ].[ Milch ].Children . Count
SELECT Measures .[ Anzahl ] ON COLUMNSFROM [ Umsatz ]
Abbildung 3.30: Count() mit Menge
Beispiel mit Tupel
WITH MEMBER Measures .[ Anzahl ] AS([Zeit].[ Monat ].&[201304], [ Produkt ].[ Sortiment ].[ Subkategorie ].[Brot]. Children ). Count
SELECT Measures .[ Anzahl ] ON COLUMNSFROM [ Umsatz ]
Diese Abfrage ermittelt die Anzahl der Elemente des Tupels
([Zeit].[ Monat ].&[201304],[ Produkt ].[ Sortiment ].[ Subkategorie ].[Brot]. Children )
3.2 Numerische Funktion 37
Abbildung 3.31: Count() Tupel
3.2.5 Covariance()
Die Funktion Covariance gibt die Auffüllungskovarianz von X-Y-Wertepaarenzurück, die über einer Menge mithilfe der Formel für die unausgewogeneAuffüllung (geteilt durch die Anzahl der X-Y-Paare) berechnet wurden.
Covariance()-Syntax
Covariance ( Set_Expression , Numeric_Expression_y [,Numeric_Expression_x ])
Beispiel
WITH MEMBER Measures .[ Covariance ] ASCovariance (
[ Produkt ].[ Sortiment ].[ Subkategorie ].[ Bagels ].Children ,[ Measures ].[ Umsatzbetrag ],[ Measures ].[ Umsatzplan ])
SELECTMeasures .[ Covariance ] ON COLUMNS ,{[ Geografie ].[ Staat ].&[ Deutschland ],[ Geografie ].[ Staat ].&[Ö sterreich ],[ Geografie ].[ Staat ].&[ Schweiz ]} ON ROWS
FROM [ Umsatz ]
Man erhält die Auffüllungskovarianz der X-Y-Wertepaare der Länder Deutsch-land, Österreich und Schweiz.
Abbildung 3.32: Covariance()
38 Kapitel 3 Funktionen
3.2.6 CovarianceN()
Die Funktion CovarianceN gibt die Stichprobenkovarianz eines X-Y-Wertepaareszurück, die über einer Menge mithilfe der Formel für die ausgewogene Auffül-lung (geteilt durch die Anzahl der X-Y-Paare) berechnet wurde.
CovarianceN()-Syntax
CovarianceN ( Set_Expression , Numeric_Expression_y [,Numeric_Expression_x ])
Beispiel
WITH MEMBER Measures .[ Covariance ] ASCovarianceN (
[ Produkt ].[ Sortiment ].[ Subkategorie ].[ Bagels ].Children ,[ Measures ].[ Umsatzbetrag ],[ Measures ].[ Umsatzplan ])
SELECTMeasures .[ Covariance ] ON COLUMNS ,{[ Geografie ].[ Staat ].&[ Deutschland ],[ Geografie ].[ Staat ].&[Ö sterreich ],[ Geografie ].[ Staat ].&[ Schweiz ]} ON ROWS
FROM [ Umsatz ]
In diesem Beispiel wird die Stichprobenkovarianz der X-Y-Wertepaare vonDeutschland, Österreich und der Schweiz zurückgegeben.
Abbildung 3.33: CovarianceN()
3.2.7 DistinctCount()
Diese Funktion gibt die Anzahl der unterschiedlichen nicht leeren Tupel ineiner Menge zurück.
DistinctCount()-Syntax
DistinctCount ( Set_Expression )
3.2 Numerische Funktion 39
Beispiel
WITH MEMBER Measures .[ Anzahl ] AS DistinctCount ([ Measures ].[ Umsatzbetrag ] * [ Produkt ].[ Sortiment ].[ Subkategorie ].[ Sauerrahm ]. Children )
SELECT { Measures .[ Anzahl ]} ON COLUMNS ,{[ Geografie ].[ Staat ].&[ Deutschland ],[ Geografie ].[ Staat ].&[Ö sterreich ],[ Geografie ].[ Staat ].&[ Schweiz ]} ON ROWS
FROM [ Umsatz ]
In diesem Beispiel erhält man als Ergebnis die Anzahl der Tupel, die Werteenthalten.
Abbildung 3.34: DistinctCount()
3.2.8 LinRegIntercept()
Die Funktion LinRegIntercept berechnet die lineare Regression einer Mengeund gibt den Wert des x-Achsen-Abschnittes (Konstante b) in der Regressi-onsgleichung y = a * x + b zurück.
LinRegIntercept()-Syntax
LinRegIntercept ( Set_Expression , Numeric_Expression_y [,Numeric_Expression_x ])
Beispiel
WITH MEMBER Measures .[ LinRegIntercept ] AS LinRegIntercept ([ Produkt ].[ Sortiment ].[ Subkategorie ].[ Bagels ].Children ,[ Measures ].[ Umsatzbetrag ],[ Measures ].[ Umsatzplan ])
SELECT Measures .[ LinRegIntercept ] ON COLUMNS ,{[ Geografie ].[ Staat ].&[ Deutschland ],[ Geografie ].[ Staat ].&[Ö sterreich ],[ Geografie ].[ Staat ].&[ Schweiz ]} ON ROWS
FROM [ Umsatz ]
40 Kapitel 3 Funktionen
Abbildung 3.35: LinRegIntercept()
3.2.9 LinRegPoint()
Diese Funktion berechnet die lineare Regression einer Menge und gibt denWert von y in der Regressionsgleichung y = a * x + b für einen bestimmtenWert von x zurück.
LinRegPoint()-Syntax
LinRegPoint ( Slice_Expression_x , Set_Expression ,Numeric_Expression_y [, Numeric_Expression_x ])
Beispiel
WITH MEMBER Measures .[ LinRegPoint ] ASLinRegPoint (
[ Measures ].[ Umsatzbetrag ],[ Produkt ].[ Sortiment ].[ Subkategorie ].[ Bagels ].Children ,[ Measures ].[ Umsatzbetrag ],[ Measures ].[ Umsatzplan ])
SELECT Measures .[ LinRegPoint ] ON COLUMNS ,{[ Geografie ].[ Staat ].&[ Deutschland ],[ Geografie ].[ Staat ].&[Ö sterreich ],[ Geografie ].[ Staat ].&[ Schweiz ]} ON ROWS
FROM [ Umsatz ]
Abbildung 3.36: LinRegPoint()
3.2 Numerische Funktion 41
3.2.10 LinRegR2()
Diese Funktion berechnet die lineare Regression einer Menge und gibt denBestimmungskoeffizienten, R2, zurück. D.h. nach dem Erhalten der Punk-temenge gibt die LinRegR2-Funktion das statistische R2 zurück, das dieÜbereinstimmung der linearen Gleichung mit den Punkten beschreibt.
LinRegR2()-Syntax
LinRegR2 ( Set_Expression , Numeric_Expression_y [,Numeric_Expression_x ])
Beispiel
WITH MEMBER Measures .[ LinRegR2 ] ASLinRegR2 (
[ Produkt ].[ Sortiment ].[ Subkategorie ].[ Bagels ].Children ,[ Measures ].[ Umsatzbetrag ],[ Measures ].[ Umsatzplan ])
SELECT Measures .[ LinRegR2 ] ON COLUMNS ,{[ Geografie ].[ Staat ].&[ Deutschland ],[ Geografie ].[ Staat ].&[Ö sterreich ],[ Geografie ].[ Staat ].&[ Schweiz ]} ON ROWS
FROM [ Umsatz ]
Abbildung 3.37: LinRegR2()
3.2.11 LinRegSlope()
Die LinRegSlope-Funktion berechnet die lineare Regression einer Menge undgibt den Wert des Regressionskoeffizienten a in der Regressionsgleichung y =a * x + b zurück.
LinRegSlope()-Syntax
LinRegSlope ( Set_Expression , Numeric_Expression_y [,Numeric_Expression_x ])
42 Kapitel 3 Funktionen
Beispiel
WITH MEMBER Measures .[ LinRegSlope ] ASLinRegSlope (
[ Produkt ].[ Sortiment ].[ Subkategorie ].[ Bagels ].Children ,[ Measures ].[ Umsatzbetrag ],[ Measures ].[ Umsatzplan ])
SELECT Measures .[ LinRegSlope ] ON COLUMNS ,{[ Geografie ].[ Staat ].&[ Deutschland ],[ Geografie ].[ Staat ].&[Ö sterreich ],[ Geografie ].[ Staat ].&[ Schweiz ]} ON ROWS
FROM [ Umsatz ]
Abbildung 3.38: LinRegSlope()
3.2.12 LinRegVariance()
Diese Funktion berechnet die lineare Regression einer Menge und gibt dieVarianz zurück, die der Regressionsgleichung y = a * x + b zugeordnet ist.Nach dem Erhalten der Punktemenge gibt die LinRegVariance-Funktion diestatistische Varianz zurück, die die Übereinstimmung der linearen Gleichungmit den Punkten beschreibt.
LinRegVariance()-Syntax
LinRegVariance ( Set_Expression , Numeric_Expression_y [,Numeric_Expression_x ] ])
Beispiel
WITH MEMBER Measures .[ LinRegVariance ] ASLinRegVariance (
[ Produkt ].[ Sortiment ].[ Subkategorie ].[ Bagels ].Children ,[ Measures ].[ Umsatzbetrag ],[ Measures ].[ Umsatzplan ])
SELECT Measures .[ LinRegVariance ] ON COLUMNS ,{[ Geografie ].[ Staat ].&[ Deutschland ],
3.2 Numerische Funktion 43
[ Geografie ].[ Staat ].&[Ö sterreich ],[ Geografie ].[ Staat ].&[ Schweiz ]} ON ROWS
FROM [ Umsatz ]
Abbildung 3.39: LinRegVariance()
3.2.13 Max()
Die Funktion Max ermittelt den Maximalwert eines numerischen Ausdrucks,der über eine Menge ausgewertet wird.
Max()-Syntax
Max( Set_Expression [, Numeric_Expression ])
Beispiel
WITH MEMBER Measures .[Max] ASMax([ Produkt ].[ Sortiment ].[ Subkategorie ].[ Bagels ].Children ,
[ Measures ].[ Umsatzbetrag ])SELECT Measures .[Max] ON COLUMNS ,
{[ Geografie ].[ Staat ].&[ Deutschland ],[ Geografie ].[ Staat ].&[Ö sterreich ],[ Geografie ].[ Staat ].&[ Schweiz ]} ON ROWS
FROM [ Umsatz ]
Abbildung 3.40: Max()
44 Kapitel 3 Funktionen
3.2.14 Median()
Diese Funktion gibt den Median eines numerischen Ausdrucks zurück, derüber eine Menge ermittelt wird.
Median()-Syntax
Median ( Set_Expression [, Numeric_Expression ])
Beispiel
WITH MEMBER Measures .[ Median ] ASMedian (
[ Produkt ].[ Sortiment ].[ Subkategorie ].[ Bagels ].Children ,[ Measures ].[ Umsatzbetrag ])
SELECT Measures .[ Median ] ON COLUMNS ,{[ Geografie ].[ Staat ].&[ Deutschland ],[ Geografie ].[ Staat ].&[Ö sterreich ],[ Geografie ].[ Staat ].&[ Schweiz ]} ON ROWS
FROM [ Umsatz ]
Abbildung 3.41: Median()
3.2.15 Min()
Die Funktion Min ermittelt den Minimalwert eines numerischen Ausdrucks,der von einer Menge ausgewertet wird.
Min()-Syntax
Min( Set_Expression [, Numeric_Expression ])
Beispiel
WITH MEMBER Measures .[Min] ASMin([ Produkt ].[ Sortiment ].[ Subkategorie ].[ Bagels ].Children ,
[ Measures ].[ Umsatzbetrag ])SELECT Measures .[Min] ON COLUMNS ,
3.2 Numerische Funktion 45
{[ Geografie ].[ Staat ].&[ Deutschland ],[ Geografie ].[ Staat ].&[Ö sterreich ],[ Geografie ].[ Staat ].&[ Schweiz ]} ON ROWS
FROM [ Umsatz ]
Abbildung 3.42: Min()
3.2.16 Ordinal()
Die Ordinal-Funktion gibt den nullbasierten Ordinalwert, der einer Ebenezugeordnet ist, zurück.
Ordinal()-Syntax
Level_Expression . Ordinal
Beispiel
WITH MEMBER Measures .[ Ordinal ] AS[Zeit].[ Kalender ].[ Quartal ]. Ordinal
SELECT Measures .[ Ordinal ] ON COLUMNSFROM [ Umsatz ]
Abbildung 3.43: Ordinal()
3.2.17 Rank()
Mit Rank wird der einsbasierten Rang eines angegebenen Tupels in einerangegebenen Menge ermittelt.
Rank()-Syntax
Rank( Tuple_Expression , Set_Expression [, Numeric Expression ])
46 Kapitel 3 Funktionen
Beispiel
WITH SET OrderedStaat AS Order([ Geografie ].[ Staat ].[ Staat ].Members ,[ Measures ].[ Umsatzbetrag ], BDESC )
MEMBER [ Measures ].[ Staat Rank] ASRank([ Geografie ].[ Staat ]. CurrentMember , OrderedStaat )
SELECT {[ Measures ].[ Staat Rank],[ Measures ].[ Umsatzbetrag ]} ON COLUMNS ,Order ([ Geografie ].[ Staat ].[ Staat ].Members ,[ Staat Rank], ASC) ON ROWS
FROM [ Umsatz ]
Abbildung 3.44: Rank()
3.2.18 Stdev() / Stddev()
Die Funktion ermittelt die Stichproben-Standardabweichung eines von ei-ner Menge ausgewerteten numerischen Ausdrucks. Die Standardabweichungwird mithilfe der Formel für die ausgewogene Auffüllung (geteilt durch n-1)berechnet.
Stdev()-Syntax
Stdev ( Set_Expression [, Numeric_Expression ])
Beispiel
WITH MEMBER Measures .[ Stdev ] ASStdev (
[ Produkt ].[ Sortiment ].[ Subkategorie ].[ Bagels ].Children ,[ Measures ].[ Umsatzbetrag ])
SELECT Measures .[ Stdev ] ON COLUMNS ,{[ Geografie ].[ Staat ].&[ Deutschland ],[ Geografie ].[ Staat ].&[Ö sterreich ],[ Geografie ].[ Staat ].&[ Schweiz ]} ON ROWS
FROM [ Umsatz ]
3.2 Numerische Funktion 47
Abbildung 3.45: Stdev()
3.2.19 StdevP() / StddevP()
Die Funktion StdevP gibt die Standardabweichung eines von einer Mengeausgewerteten numerischen Ausdrucks bezüglich der Auffüllung zurück. DieserWert wird mithilfe der Formel (Maximum Likelihood Schätzung) für dieunausgewogene Auffüllung (geteilt durch n) berechnet.
StdevP()-Syntax
StdevP ( Set_Expression [, Numeric_Expression ])
Beispiel
WITH MEMBER Measures .[ StdevP ] ASStdevP (
[ Produkt ].[ Sortiment ].[ Subkategorie ].[ Bagels ].Children ,[ Measures ].[ Umsatzbetrag ])
SELECT Measures .[ StdevP ] ON COLUMNS ,{[ Geografie ].[ Staat ].&[ Deutschland ],[ Geografie ].[ Staat ].&[Ö sterreich ],[ Geografie ].[ Staat ].&[ Schweiz ]} ON ROWS
FROM [ Umsatz ]
Abbildung 3.46: StdevP()
3.2.20 Sum()
Die Funktion Sum ermittelt die Summe eines numerischen Ausdrucks, der übereiner Menge ausgewertet wird.
48 Kapitel 3 Funktionen
Sum()-Syntax
Sum( Set_Expression [, Numeric_Expression ])
Beispiel
WITH MEMBER Measures .[Sum] ASSum([ Measures ].[ Umsatzbetrag ] *
[ Produkt ].[ Sortiment ].[ Subkategorie ].[ Bagels ]. Children )SELECT Measures .[Sum] ON COLUMNS ,
{[ Geografie ].[ Staat ].&[ Deutschland ],[ Geografie ].[ Staat ].&[Ö sterreich ],[ Geografie ].[ Staat ].&[ Schweiz ]} ON ROWS
FROM [ Umsatz ]
Abbildung 3.47: Sum()
3.2.21 Value()
Die Funktion Value gibt den Wert des aktuellen Elements der Measure-Dimension zurück, der sich mit dem aktuellen Element der Attributhierarchienim Kontext der Abfrage überschneidet.
Value()-Syntax
Member_Expression [. Value ]
Beispiel
WITH MEMBER [ Measures ].[ Value ] AS[ Measures ].[ Umsatzbetrag ]. ValueSELECT [ Measures ].[ Value ] ON COLUMNS ,
([ Produkt ].[ Kategorie ].&[01],[Zeit].[Jahr].&[2013]) ON ROWS
FROM [ Umsatz ]
3.2 Numerische Funktion 49
Abbildung 3.48: Value()
3.2.22 Var() / Variance()
Die Var-Funktion ermittelt die Stichprobenvarianz eines von einer Mengeausgewerteten numerischen Ausdrucks. Die Stichprobenvarianz wird mithilfeder Formel (Varianz für die Menge) für die ausgewogene Auffüllung (geteiltdurch n) berechnet.
Variance()-Syntax
Var( Set_Expression [, Numeric_Expression ])
Beispiel
WITH MEMBER Measures .[Var] ASVar([ Produkt ].[ Sortiment ].[ Subkategorie ].[ Bagels ].Children ,
[ Measures ].[ Umsatzbetrag ])SELECT Measures .[Var] ON COLUMNS ,
{[ Geografie ].[ Staat ].&[ Deutschland ],[ Geografie ].[ Staat ].&[Ö sterreich ],[ Geografie ].[ Staat ].&[ Schweiz ]} ON ROWS
FROM [ Umsatz ]
Abbildung 3.49: Var()
3.2.23 VarP() / VarianceP()
Die Funktion VarP gibt die Auffüllungsvarianz eines von einer Menge ausge-werteten numerischen Ausdrucks zurück. Die Auffüllungsvarianz wird mithilfeder Formel (Varianz für die Menge) für die unausgewogene Auffüllung (geteiltdurch n-1) berechnet.
50 Kapitel 3 Funktionen
VarianceP()-Syntax
VarP( Set_Expression [, Numeric_Expression ])
Beispiel
WITH MEMBER Measures .[VarP] ASVarP(
[ Produkt ].[ Sortiment ].[ Subkategorie ].[ Bagels ].Children ,[ Measures ].[ Umsatzbetrag ])
SELECT Measures .[VarP] ON COLUMNS ,{[ Geografie ].[ Staat ].&[ Deutschland ],[ Geografie ].[ Staat ].&[Ö sterreich ],[ Geografie ].[ Staat ].&[ Schweiz ]} ON ROWS
FROM [ Umsatz ]
Abbildung 3.50: VarP()
3.3 Mengenfunktion
3.3.1 AllMembers()
Die Funktion AllMembers wertet entweder einen Hierarchieausdruck odereinen Ebenenausdruck aus. Es wird eine Menge zurück gegeben, die alleElemente der angegebenen Hierarchie oder Ebene enthält. Hierzu zählen alleberechneten Elemente der Hierarchie oder Ebene.
AllMembers()-Syntax
// Hierarchie :Hierarchy_Expression . AllMembers// Ebene :Level_Expression . AllMembers
3.3 Mengenfunktion 51
Beispiel mit Hierarchie
SELECT [Zeit].[Jahr].[2013] ON COLUMNS ,[ Sortiment ]. AllMembers ON ROWS
FROM [ Umsatz ]
Beispiel mit Ebene
SELECT [Zeit].[Jahr].[2013] ON COLUMNS ,[ Produkt ].[ Sortiment ].[ Subkategorie ]. AllMembers ON ROWS
FROM [ Umsatz ]
Abbildung 3.51: AllMembers() mit Hierarchie-Ausdruck (oben) und Ebe-nenausdruck (unten)
3.3.2 Ancestors()
Ancestors ist eine Funktion, die die Menge aller Vorgänger eines angegebenenElements in einer angegebenen Ebene oder in einem angegebenen Abstandvom Element zurückgibt. In Microsoft SQL Server Analysis Services 2012enthält die zurückgegebene Menge stets ein einzelnes Element. Die Rückgabemehrerer übergeordnete Elemente zu einem einzelnen Element werden vonAnalysis Services nicht unterstützt.
52 Kapitel 3 Funktionen
Ancestors()-Syntax
// Ebene :Ancestors ( Member_Expression , Level_Expression )// Numeric :Ancestors ( Member_Expression , Distance )
Beispiel mit Ebene
SELECT {[ Measures ].[ Umsatzbetrag ]} ON COLUMNS ,Ancestors ([ Produkt ].[ Sortiment ].[ Produkt ].[Herta - extra magerer Hamburger ],[ Produkt ].[ Sortiment ].[ Subkategorie ]) ON ROWS
FROM [ Umsatz ]
Beispiel mit Abstand
SELECT {[ Measures ].[ Umsatzbetrag ]} ON COLUMNS ,Ancestors ([ Produkt ].[ Sortiment ].[ Produkt ].&[1002], 2)ON ROWS
FROM [ Umsatz ]
Abbildung 3.52: Ancestors() mit Ebenenangabe (links) und Abstandsan-gabe (rechts)
3.3.3 Ascendants()
Ascendants gibt eine Menge der vorausgehenden Elemente zu einem angege-benen Element zurück, einschließlich des Elements selbst.
Ascendants()-Syntax
Ascendants ( Member_Expression )
Beispiel
SELECT {[ Measures ].[ Umsatzbetrag ]} ON COLUMNS ,Ascendants ([ Produkt ].[ Sortiment ].[ Produkt ].&[2012])ON ROWS
FROM [ Umsatz ]
3.3 Mengenfunktion 53
Mit dieser Abfragen wird das Element selbst und die darüber liegendenEbenen ausgegeben.
Abbildung 3.53: Ascendants()
3.3.4 Axis()
Die Funktion Axis gibt die Menge der Tupel auf der angegebenen Achsezurück.
Axis()-Syntax
Axis( Axis_Number )
Beispiel
WITH MEMBER Measures . AXISDEMO AS SetToValue (Axis (1))SELECT Measures . AXISDEMO ON 0,
[Zeit].[ Quartal ]. members ON 1FROM [ Umsatz ]
Abbildung 3.54: Axis()
54 Kapitel 3 Funktionen
3.3.5 BottomCount()
Die Funktion BottomCount sortiert eine Menge in aufsteigender Reihenfolgeund gibt die angegebene Anzahl von Tupeln in der angegebenen Menge mitden niedrigsten Werten zurück.
BottomCount()-Syntax
BottomCount ( Set_Expression , Count [, Numeric_Expression ])
Beispiel
SELECT {[ Measures ].[ Umsatzbetrag ]} ON COLUMNS ,BottomCount (
[ Produkt ].[ Sortiment ].[ Subkategorie ].&[006].Children ,8, [ Measures ].[ Umsatzbetrag ]) ON ROWS
FROM [ Umsatz ]
Abbildung 3.55: BottomCount()
3.3.6 BottomPercent()
Die Funktion BottomPercent sortiert eine Menge in aufsteigender Reihenfolgeund gibt eine Menge von Tupeln mit den niedrigsten Werten zurück, derenkumulativer Gesamtwert größer oder gleich einem angegebenen Prozentsatzist.
BottomPercent()-Syntax
BottomPercent ( Set_Expression , Percentage ,Numeric_Expression )
3.3 Mengenfunktion 55
Beispiel
SELECT {[ Measures ].[ Umsatzbetrag ]} ON COLUMNS ,BottomPercent (
[ Produkt ].[ Sortiment ].[ Subkategorie ].&[006].Children ,18, ([ Measures ].[ Umsatzbetrag ])) ON ROWS
FROM [ Umsatz ]
Als Ergebnis der Abfrage erhält man die Elemente deren Gesamtwert über18% des Wertes ihres übergeordneten Elements kommen.
Abbildung 3.56: BottomPercent()
3.3.7 BottomSum()
Die BottomSum-Funktion sortiert eine angegebene Menge in aufsteigenderReihenfolge und gibt eine Menge von Tupeln mit den niedrigsten Wertenzurück, deren Summe kleiner oder gleich einem angegebenen Wert ist.
BottomSum()-Syntax
BottomSum ( Set_Expression , Value , Numeric_Expression )
Beispiel
SELECT {[ Measures ].[ Umsatzbetrag ]} ON COLUMNS ,BottomSum (
[ Produkt ].[ Sortiment ].[ Subkategorie ].&[006].Children ,50000 , ([ Measures ].[ Umsatzbetrag ])) ON ROWS
FROM [ Umsatz ]
Abbildung 3.57: BottomSum()
56 Kapitel 3 Funktionen
3.3.8 Children()
Die Funktion Children gibt die Menge der untergeordneten Elemente einesangegebenen Elements zurück.
Children()-Syntax
Member_Expression . Children
Beispiel
SELECT{[ Geografie ].[ Region ].&[ Deutschland Ost]} ON COLUMNS ,{[ Produkt ].[ Subkategorie ]. Children } ON ROWS
FROM [ Umsatz ]
Abbildung 3.58: Children()
3.3.9 Crossjoin()
Crossjoin gibt das Kreuzprodukt mindestens einer Menge zurück.
Crossjoin()-Syntax
// Standard :Crossjoin ( Set_Expression1 , Set_Expression2 [, ...n])
3.3 Mengenfunktion 57
// Alternativ :Set_Expression1 * Set_Expression2 [* ...n]
Beispiele
// Standardsyntax :SELECT
{[ Geografie ].[ Region ].&[ Deutschland Ost]} ON COLUMNS ,Crossjoin ([ Produkt ].[ Subkategorie ].Children , [ Geografie ].
[ Unternehmen ].[ Region ].&[ Deutschland Ost]. Children )ON ROWS
FROM [ Umsatz ]// alternative Syntax :SELECT
{[ Geografie ].[ Region ].&[ Deutschland Ost]} ON COLUMNS ,([ Produkt ].[ Subkategorie ]. Children * [ Geografie ].
[ Unternehmen ].[ Region ].&[ Deutschland Ost]. Children )ON ROWSFROM [ Umsatz ]
Das Abfrageergebnis ist in Abbildung 3.59 auf Seite 57 dargestellt.
Abbildung 3.59: Crossjoin()
58 Kapitel 3 Funktionen
3.3.10 Descendants()
Descendants gibt eine Menge von nachfolgenden Werten des Elements auf derangegebenen Ebene oder in dem angegebenen Abstand zurück. Das ArgumentDesc_Flag ist ein gültiger Zeichenfolgenausdruck der ein Beschreibungs-Flagzur Unterscheidung möglicher Mengen von nachfolgenden Werten angibt.Optional können weite Werte anderer Ebenen ein- oder ausgeschlossen werden(siehe Tab. 3.2, S. 61).
Descendants()-Syntax
// Element mit Verwendung eines Ebenenausdrucks :Descendants ( Member_Expression [, Level_Expression [,
Desc_Flag ] ])// Element mit Verwendung eines numerischen Ausdrucks :Descendants ( Member_Expression [, Distance [, Desc_Flag ] ])// Menge mit Verwendung eines Ebenenausdrucks :Descendants ( Set_Expression [, Level_Expression [,
Desc_Flag ] ])// Menge mit Verwendung eines numerischen Ausdrucks :Descendants ( Set_Expression [, Distance [, Desc_Flag ] ])
Beispiel mit Ebene und Abstand
SELECT[ Geografie ].[ Region ].&[ Deutschland Ost] ON COLUMNS ,Descendants (
[ Produkt ].[ Sortiment ].[ Kategorie ].[ Fleisch ], 1) ON ROWSFROM [ Umsatz ]
Es werden alle Elemente der Hierarchieebene Subkategorie angezeigt, welcheunter dem Element Fleisch liegen bzw. diesem zugeordnet sind, da diese denAbstand = 1 zum angegeben Element besitzen.
Abbildung 3.60: Descendants() mit Ebene und Abstand
3.3 Mengenfunktion 59
Beispiel mit Element und Ebene
SELECT[ Geografie ].[ Region ].&[ Deutschland Ost] ON COLUMNS ,Descendants ([ Produkt ].[ Sortiment ].[ Kategorie ].[ Fleisch ],
[ Produkt ].[ Sortiment ].[ Produkt ]) ON ROWSFROM [ Umsatz ]
Es werden alle Elemente der Hierarchieebene Produkt angezeigt, welcheunter dem Element Fleisch liegen bzw. diesem zugeordnet sind.
Abbildung 3.61: Descendants() mit Element und Ebene
Beispiel mit BEFORE
SELECT[ Geografie ].[ Region ].&[ Deutschland Ost] ON COLUMNS ,Descendants ([ Produkt ].[ Sortiment ].[ Kategorie ].[ Fleisch ],
[ Produkt ].[ Sortiment ].[ Produkt ],Before ) ON ROWSFROM [ Umsatz ]
Beispiel mit SELF_AND_BEFORE
SELECT[ Geografie ].[ Region ].&[ Deutschland Ost] ON COLUMNS ,Descendants ([ Produkt ].[ Sortiment ].[ Kategorie ].[ Fleisch ],
[ Produkt ].[ Sortiment ].[ Produkt ], SELF_AND_BEFORE )ON ROWS
FROM [ Umsatz ]
60 Kapitel 3 Funktionen
Abbildung 3.62: Descendants() mit BEFORE
Abbildung 3.63: Descendants() mit SELF_AND_BEFORE
3.3 Mengenfunktion 61
Tabelle 3.2: Argumente für Descendants-Flag (DESC_FLAG)
Flag Beschreibung
SELF Gibt nur die nachfolgenden Elemente auf der angegebenenEbene oder Abstand zurück. Die Funktion schließt das ange-gebene Element ein, wenn es sich bei der angegebenen Ebeneoder Abstand um die Ebene des angegebenen Elements han-delt.
AFTER Gibt alle nachfolgenden Elemente zurück, die der angegebenenEbene oder Abstand untergeordnet sind.
BEFORE Gibt die Elemente aus allen Ebenen zwischen dem angege-benen Element und der angegebenen Ebene oder Abstandzurück. Das angegebene Element wird ebenfalls angezeigt,jedoch nicht die Elemente der angegebenen Ebene oder desAbstands.
BEFORE_AND_AFTER
Gibt alle Elemente aus allen Ebenen zurück, die der Ebene desangegebenen Elements untergeordnet sind, sowie das angege-bene Element. Jedoch werden die Elemente in der angegebenenEbene oder Abstand nicht angezeigt.
SELF_AND_AFTER
Gibt die nachfolgende Elemente aus der angegebenen Ebeneoder Abstand sowie alle Ebenen, die der angegebenen Ebeneoder dem angegebenen Abstand untergeordnet sind, zurück.
SELF_AND_BEFORE
Gibt alle nachfolgenden Elemente aus der angegebenen Ebeneoder Abstand sowie die Elemente aus allen Ebenen zwischendem angegebenen Element und der angegebenen Ebene oderAbstand, einschließlich des angegebenen Elements, zurück.
SELF_BEFORE_AFTER
Gibt die nachfolgende Elemente aus allen Ebenen zurück,die der Ebene des angegebenen Elements untergeordnet sind,sowie das angegebene Element selbst.
LEAVES Gibt die nachfolgende Blattelemente zwischen dem angege-benen Element und der angegebenen Ebene oder Abstandzurück.
3.3.11 Distinct()
Die Distinct-Funktion wertet eine angegebene Menge aus, entfernt dabeidoppelte Tupel aus der Menge und gibt die resultierende Menge zurück.
62 Kapitel 3 Funktionen
Distinct()-Syntax
Distinct ( Set_Expression )
Beispiel
SELECT {[Zeit].[Jahr].&[2013]} ON COLUMNS ,Distinct (
{[ Geografie ].[ Unternehmen ].[ Staat ].&[ Deutschland ],[ Geografie ].[ Unternehmen ].[ Staat ].&[ Deutschland ],[ Geografie ].[ Unternehmen ].[ Staat ].&[ Schweiz ]}) ON ROWS
FROM [ Umsatz ]
Abbildung 3.64: Distinct()
3.3.12 DrilldownMember()
Die Funktion DrilldownMember führt einen Drilldown für Elemente in einerangegebenen Menge aus, die in einer angegebenen zweiten Menge vorhandensind. Alternativ führt die Funktion einen Drilldown für eine Menge von Tupelnunter Verwendung der ersten Tupelhierarchie oder der optional angegebenenHierarchie aus.
DrilldownMember()-Syntax
DrillDownMember ( Set_Expression1 , Set_Expression2 [,[ Target_Hierarchy ]] [, [ RECURSIVE ] [, INCLUDE_CALC_MEMBERS ] ] )
Beispiel ohne RECURSIVE
SELECTDrilldownMember ([ Geografie ].[ Unternehmen ].Children ,
{[ Geografie ].[ Unternehmen ].[ Staat ].[ Deutschland ],[ Geografie ].[ Unternehmen ].[ Region ].&[ Deutschland Ost]})
ON COLUMNSFROM [ Umsatz ]
Es wird ein Drilldown für das Element Deutschland der ersten Mengeausgeführt, welches auch in der zweiten Menge vorkommt.
3.3 Mengenfunktion 63
Abbildung 3.65: DrilldownMember() ohne RECURSIVE
Beispiel mit RECURSIVE
SELECTDrilldownMember ([ Geografie ].[ Unternehmen ].Children ,
{[ Geografie ].[ Unternehmen ].[ Staat ].[ Deutschland ],[ Geografie ].[ Unternehmen ].[ Region ].&[ Deutschland Ost]},RECURSIVE ) ON COLUMNS
FROM [ Umsatz ]
In diesem Beispiel wird ein Drilldown für das Element Deutschland der erstenMenge, das auch in der zweiten Menge enthalten ist, ausgeführt. Da diesmaljedoch das RECURSIVE-Argument angegeben wurde, vergleicht die Funktionweiterhin rekursiv die Elemente der Ergebnismenge (Elemente der EbeneRegion) mit der zweiten Menge. Dabei werden die untergeordneten Elementefür jedes Element in der Ergebnismenge (Elemente der Ebene Bundesland)abgerufen, das auch in der zweiten Menge vorhanden ist, bis keine weiterenElemente aus der Ergebnismenge in der zweiten Menge gefunden werden.
Abbildung 3.66: DrilldownMember() mit RECURSIVE
3.3.13 DrilldownMemberBottom()
Die Funktion DrilldownMemberBottom führt einen Drilldown bei Elementenin einer angegebenen Menge aus, die in einer angegebenen zweiten Mengevorhanden sind, wobei die Ergebnismenge auf eine angegebene Anzahl vonElementen beschränkt wird. Wie DrillDownMember (vgl. Abschnitt 3.3.12)kann die Funktion einen Drilldown auf eine eine Menge von Tupeln ausführen.
DrilldownMemberBottom()-Syntax
DrilldownMemberBottom ( Set_Expression1 , Set_Expression2 ,Count [, [ Numeric_Expression ][, RECURSIVE ] ])
64 Kapitel 3 Funktionen
Beispiel
SELECTDrilldownMemberBottom (
{[ Produkt ].[ Sortiment ].[ Subkategorie ].&[001],[ Produkt ].[ Sortiment ].[ Subkategorie ].&[010]},[ Produkt ].[ Sortiment ].[ Subkategorie ].&[001], 3,[ Measures ].[ Umsatzmenge ]) ON COLUMNS
FROM [ Umsatz ]WHERE [ Measures ].[ Umsatzmenge ]
In diesem Beispiel werden neben den Umsatzmengen von Bagels und Brotdie drei Elemente mit den niedrigsten Umsatzmengen aus der SubkategorieBagels angezeigt.
Abbildung 3.67: DrilldownMemberBottom()
3.3.14 DrilldownMemberTop()
Diese Funktion führt einen Drilldown bei Elementen in einer angegebenenMenge aus, die in einer angegebenen zweiten Menge vorhanden sind, wo-bei das Resultset auf eine angegebene Anzahl von Elementen beschränktwird. Alternative ist hier die Verwendung von Tupeln möglich (vgl. vorherigeAbschnitte).
DrilldownMemberTop()-Syntax
DrilldownMemberBottom ( Set_Expression1 , Set_Expression2 ,Count [, [ Numeric_Expression ][, RECURSIVE ] ])
Beispiel
SELECTDrilldownMemberTop (
{[ Produkt ].[ Sortiment ].[ Subkategorie ].&[001],[ Produkt ].[ Sortiment ].[ Subkategorie ].&[010]},[ Produkt ].[ Sortiment ].[ Subkategorie ].&[001], 3,[ Measures ].[ Umsatzmenge ]) ON COLUMNS
FROM [ Umsatz ]
3.3 Mengenfunktion 65
In diesem Beispiel werden neben den Umsatzmengen von Bagels und Brotdie drei Elemente mit den höchsten Umsatzmenge der Subkategorie Bageslangezeigt.
Abbildung 3.68: DrilldownMemberTop()
3.3.15 DrillupLevel()
Die Funktion DrillupLevel führt einen Drillup der Elemente einer Mengeaus, die sich in und oberhalb der angegebenen Ebene befinden.
DrillupLevel()-Syntax
DrillupLevel ( Set_Expression [, Level_Expression ])
Beispiel
SELECTDrillupLevel ({[ Produkt ].[ Sortiment ].[ Kategorie ],[ Produkt ].[ Sortiment ].[ Subkategorie ].&[001],[ Produkt ].[ Sortiment ].[ Subkategorie ].&[010],[ Produkt ].[ Sortiment ].[ Produkt ].&[1203]},[ Produkt ].[ Sortiment ].[ Subkategorie ]) ON COLUMNS
FROM [ Umsatz ]WHERE [ Measures ].[ Umsatzmenge ]
Bei dieser Abfrage werden nur die angegeben Elemente der Ebene Sub-kategorien und die Elemente der höheren Ebene angezeigt. Somit wird dasangegebene Element der Ebene Produkt nicht angezeigt.
Abbildung 3.69: DrillupLevel()
3.3.16 Except()
Die Funktion Except wertet zwei Mengen aus und entfernt diejenigen Tupelder ersten Menge, die auch in der zweiten Menge vorhanden sind. Optional
66 Kapitel 3 Funktionen
können mit dem Parameter ALL auch doppelte Werte beibehalten werden.
Except()-Syntax
Except ( Set_Expression1 , Set_Expression2 [, ALL ])
Beispiel
SELECT [ Geografie ].[ Unternehmen ].[ Region ].&[ Deutschland Ost]. Children ON COLUMNS ,
Except ([ Produkt ].[ Sortiment ].[ Kategorie ].[ Backwaren ].Children ,[ Produkt ].[ Sortiment ].[ Subkategorie ].[ Muffins ])
ON ROWSFROM [ Umsatz ]
In diesem Beispiel wird das Tupel Muffins nicht angezeigt da es sowohl inder ersten als auch in der zweiten Menge vorkommt.
Abbildung 3.70: Except()
3.3.17 Exists()
Die Funktion Exists gibt die Menge der Tupel zurück, die in der erstenangegeben Menge, sowie in der zweiten angegeben Menge vorkommen. Wirdder optionale Parameter MeasureGroupName angegeben, gibt die FunktionTupel zurück, die zusammen mit einem oder mehreren Tupeln der zweitenMenge vorhanden sind, sowie Tupel mit verknüpften Zeilen in der Faktentabelleder angegebenen Measuregruppe.
Exists()-Syntax
Exists ( Set_Expression1 , Set_Expression2 [,MeasureGroupName ])
Beispiel
SELECT [ Geografie ].[ Unternehmen ].[ Region ].
3.3 Mengenfunktion 67
&[ Deutschland Ost]. Children ON COLUMNS ,Exists ([ Produkt ].[ Sortiment ].[ Kategorie ].&[01].Children ,
[ Produkt ].[ Sortiment ].[ Subkategorie ].&[009]) ON ROWSFROM [ Umsatz ]
Bei diesem Beispiel gibt die Funktion das Tupel Muffin zurück, da dieses inder ersten und zweiten Menge vorhanden ist.
Abbildung 3.71: Exists()
3.3.18 Filter()
Die Funktion Filter untersucht eine angegebene Menge basierend auf einerSuchbedingung und gibt dann die gültige Ergebnismenge zurück.
Filter()-Syntax
Filter ( Set_Expression , Logical_Expression )
Beispiel
SELECT [ Measures ].[ Umsatzmenge ] ON COLUMNS ,Filter (
{[ Produkt ].[ Sortiment ].[ Kategorie ].&[01]. Children },[ Measures ].[ Umsatzmenge ] > 150000) ON ROWS
FROM [ Umsatz ]
Das Tupel Muffin wird nicht angezeigt weil die Umsatzmenge nur 133707Stück beträgt und damit der Bedingung nicht genügt.
Abbildung 3.72: Filter()
68 Kapitel 3 Funktionen
3.3.19 Head()
Die Funktion Head gibt die Anzahl der angegeben Elementen aus einer Mengezurück, wobei die Reihenfolge der Elemente so zurückgeben wird wie sie imCube stehen. Doppelte Werte werden bei dieser Funktion beibehalten.
Head()-Syntax
Head( Set_Expression [, Count ])
Beispiel
SELECT [ Measures ].[ Umsatzbetrag ] ON COLUMNS ,Head([ Produkt ].[ Sortiment ].[ Subkategorie ].[Brot].
Children , 5) ON ROWSFROM Umsatz
Abbildung 3.73: Head()
3.3.20 Hierarchize()
Mit Hierarchize werden die Elemente einer Menge hierarchisch angeordnet.Doppelte Werte werden immer beibehalten.
Hierarchize()-Syntax
Hierarchize ( Set_Expression [, POST ])
Beispiel ohne POST
SELECT [ Measures ].[ Umsatzbetrag ] ON COLUMNS ,Hierarchize ({[ Produkt ].[ Sortiment ].[ Kategorie ],
[ Produkt ].[ Sortiment ].[ Subkategorie ]}) ON ROWSFROM Umsatz
3.3 Mengenfunktion 69
Abbildung 3.74: Hierarchize() ohne POST
Es werden die die Elemente der unteren Ebene unter den Elementen deroben Ebene angezeigt (Abb. 3.74).
Beispiel mit POST
SELECT [ Measures ].[ Umsatzbetrag ] ON COLUMNS ,Hierarchize ({[ Produkt ].[ Sortiment ].[ Kategorie ],
[ Produkt ].[ Sortiment ].[ Subkategorie ]}, POST) ON ROWSFROM Umsatz
Wenn der Parameter POST gesetzt ist, werden die Elemente der unterge-ordneten Ebene vor den Elementen der oberen Ebene angezeigt (Abb. 3.75,S. 70).
3.3.21 LastPeriods()
Mit LastPeriods wird eine Menge von Elementen bis einschließlich des ange-gebenen Elements zurückgegeben.
70 Kapitel 3 Funktionen
Abbildung 3.75: Hierarchize() mit POST
LastPeriods()-Syntax
LastPeriods ( Index [, Member_Expression ])
Beispiel
SELECT [ Measures ].[ Umsatzbetrag ] ON COLUMNS ,LastPeriods (3, [Zeit].[ Kalender ].[ Quartal ].&[201304])ON ROWS
FROM Umsatz
Abbildung 3.76: LastPeriods()
3.3 Mengenfunktion 71
3.3.22 Members()
Die Funktion Members gibt die Menge der Elemente in einer Dimension, Ebeneoder Hierarchie zurück.
Members()-Syntax
// Hierarchie :Hierarchy_Expression . Members// Ebene :Level_Expression . Members
Beispiel mit Ebene
SELECT [ Measures ].[ Umsatzbetrag ] ON COLUMNS ,[Zeit].[Jahr].[Jahr]. Members ON ROWS
FROM Umsatz
Beispiel mit Hierarchie
SELECT[ Measures ].[ Umsatzbetrag ] ON COLUMNS ,[Zeit].[ Kalender ]. Members ON ROWS
FROM Umsatz
Abbildung 3.77: Members() mit Ebenenausdruck (links) und Hierarchie-ausdruck (rechts)
72 Kapitel 3 Funktionen
3.3.23 NameToSet()
Die Funktion NameToSet gibt eine Menge zurück, die das durch eine Zeichen-folge im MDX-Format angegebene Element enthält.
NameToSet()-Syntax
NameToSet ( Member_Name )
Beispiel
SELECT [ Measures ].[ Umsatzbetrag ] ON COLUMNS ,NameToSet ("[ Bagels ]") ON ROWS
FROM Umsatz
Abbildung 3.78: NameToSet()
3.3.24 Order()
Die Funktion Order ordnet die Elemente einer angegebenen Menge an, wobeidie Hierarchie optional beibehalten wird oder nicht.
Order()-Syntax
// Nummerische Syntax :Order ( Set_Expression , Numeric_Expression [,
{ASC | DESC | BASC | BDESC } ])// String - Syntax :Order ( Set_Expression , String_Expression [,
{ASC | DESC | BASC | BDESC } ])
Beispiel
SELECT Order (([ Produkt ].[ Sortiment ].[ Kategorie ].[ Fleisch ].Children ,
[ Measures ].[ Umsatzbetrag ]), BDESC ) ON COLUMNSFROM Umsatz
3.3 Mengenfunktion 73
Abbildung 3.79: Order()
3.3.25 PeriodsToDate()
Die Funktion PeriodsToDate gibt eine Menge von gleich geordneten Elemen-ten zurück, die derselben Ebene angehören wie ein angegebenes Element. DieMenge beginnt mit dem ersten gleich geordneten Element und endet mit demangegebenen Element, entsprechend der Einschränkung durch eine angegebeneEbene in der Dimension Zeit.
PeriodsToDate()-Syntax
PeriodsToDate ([ Level_Expression [, Member_Expression ] ])
Beispiel
SELECT PeriodsToDate ([Zeit].[ Kalender ].[Jahr],[Zeit].[ Kalender ].[ Monat ].&[201308]) ON COLUMNS
FROM Umsatz
Abbildung 3.80: PeriodsToDate()
3.3.26 Siblings()
Siblings gibt alle gleichgeordneten Elemente des angegebenen Elements unddas angegebene Element selbst zurück.
Siblings()-Syntax
Member_Expression . Siblings
Beispiel
SELECT {[ Measures ].[ Umsatzbetrag ]} ON COLUMNS ,{([Zeit].[Jahr].[2013], [Zeit].[ Quartal ].[1. Quartal ].
Siblings )} ON ROWSFROM [ Umsatz ]
74 Kapitel 3 Funktionen
Abbildung 3.81: Siblings()
3.3.27 StripCalculatedMembers()
Die StripCalculatedMembers-Funktion gibt eine Menge zurück, die durchEntfernen berechneter Elemente aus einer angegebenen Menge entsteht.
StripCalculatedMembers()-Syntax
StripCalculatedMembers ( Set_Expression )
Beispiel
WITH MEMBER [ Measures ].[ Differenz zum Plan] AS"([ Measures ].[ Umsatzplan ]-[ Measures ].[ Umsatzbetrag ])* -1"
SELECTStripCalculatedMembers ({[ Measures ].[ Differenz zum Plan],
[ Measures ].[ Umsatzbetrag ]}) ON COLUMNS ,{([Zeit].[Jahr].[2013], [Zeit].[ Quartal ].[1. Quartal ].
Siblings )} ON ROWSFROM [ Umsatz ]
Abbildung 3.82: StripCalculatedMembers()
3.3.28 StrToSet()
Die Funktion StrToSet liefert eine Menge, die durch eine Zeichenfolge imMDX-Format angegeben wurde.
3.3 Mengenfunktion 75
StrToSet()-Syntax
StrToSet ( Set_Specification [, CONSTRAINED ])
Beispiel
SELECT StrToSet ("[ kumulierter Umsatz ]") ON COLUMNS ,{([Zeit].[Jahr].[2013], [Zeit].[ Quartal ].[1. Quartal ].
Siblings )} ON ROWSFROM [ Umsatz ]
Abbildung 3.83: StrToSet()
3.3.29 Subset()
Die Funktion Subset liefert ausgehend von einer angegebenen Startpositioneine Teilmenge von Tupeln aus einer angegeben Menge zurück. Die Startpo-sition basiert auf einem nullbasierten Index, d. h., 0 entspricht dem erstenTupel in der Menge, 1 entspricht dem zweiten Tupel usw. Wenn Count nichtangegeben wird, gibt die Funktion alle Tupel von Start bis zum Ende derMenge zurück.
Subset()-Syntax
Subset ( Set_Expression , Start [, Count ])
Beispiel
SELECTSubset ([ Produkt ].[ Sortiment ].[ Subkategorie ].[ Bagels ].
Children , 1, 2) ON COLUMNS ,{([Zeit].[Jahr].[2013], [Zeit].[ Quartal ].[1. Quartal ].
Siblings )} ON ROWSFROM [ Umsatz ]
76 Kapitel 3 Funktionen
Abbildung 3.84: Subset()
3.3.30 Tail()
Die Funktion Tail gibt eine Teilmenge vom Ende der angegeben Menge aus.
Tail()-Syntax
Tail( Set_Expression [, Count ])
Beispiel
SELECT Tail([ Produkt ].[ Sortiment ].[ Subkategorie ].&[001].Children , 3) ON COLUMNS ,
{([Zeit].[Jahr].[2013], [Zeit].[ Quartal ].[1. Quartal ].Siblings )} ON ROWS
FROM [ Umsatz ]
Ohne die Angabe des Wertes für den Parameter Count würde nur das letzteElemente der Menge zurückgegeben werden.
Abbildung 3.85: Tail()
3.3.31 TopCount()
TopCount sortiert eine Menge in absteigender Reihenfolge und gibt die ange-gebene Anzahl von Elementen mit dem höchsten Wert zurück.
3.3 Mengenfunktion 77
TopCount()-Syntax
TopCount ( Set_Expression , Count [, Numeric_Expression ])
Beispiel
SELECT TopCount ([ Geografie ].[ Unternehmen ].[ Region ].&[ Deutschland Nord].Children , 3,
[ Measures ].[ Umsatzbetrag ]) ON COLUMNS ,[ Measures ].[ Umsatzbetrag ] ON ROWS
FROM [ Umsatz ]
Abbildung 3.86: TopCount()
3.3.32 TopPercent()
Die Funktion TopPercent sortiert eine Menge in absteigender Reihenfolgeund gibt eine Menge von Tupeln mit den höchsten Werten zurück, derenkumulativer Gesamtwert größer oder gleich einem angegebenen Prozentsatzist.
TopPercent()-Syntax
TopPercent ( Set_Expression , Percentage , Numeric_Expression )
Beispiel
SELECT TopPercent ([ Geografie ].[ Unternehmen ].[ Region ].&[ Deutschland Nord].Children , 50,
[ Measures ].[ Umsatzbetrag ]) ON COLUMNS ,[ Measures ].[ Umsatzbetrag ] ON ROWS
FROM [ Umsatz ]
Als Ergebnis werden die Bundesländer Schleswig-Holstein und Bremenzurückgegeben, da diese beiden zusammen mindestens 50 Prozent des Um-satzbetrages der Region Deutschland Nord ausmachen.
78 Kapitel 3 Funktionen
Abbildung 3.87: TopPercent()
3.3.33 TopSum()
TopSum sortiert eine Menge und gibt die obersten Elemente zurück, derenkumulative Summe mindestens einem angegebenen Wert entspricht.
TopSum()-Syntax
TopSum ( Set_Expression , Value , Numeric_Expression )
Beispiel
SELECT TopSum ([ Geografie ].[ Unternehmen ].[ Region ].&[ Deutschland Nord].Children , 900000 ,
[ Measures ].[ Umsatzbetrag ]) ON COLUMNS ,[ Measures ].[ Umsatzbetrag ] ON ROWS
FROM [ Umsatz ]
Abbildung 3.88: TopSum()
3.3.34 Union()
Die Funktion Union gibt die Vereinigungsmenge zweier Mengen zurück, wobeioptional doppelte Elemente beibehalten werden. Bei Verwendung der Stan-dardsyntax werden doppelte Werte standardmäßig gelöscht. Hierbei werdendoppelte Werte vom Ende her gelöscht. Durch Einbezug des Parameters ALLbleiben doppelte Werte in der vereinigten Menge erhalten.
Union()-Syntax
Union ( Set_Expression1 , Set_Expression2 [, ...n ][, ALL ])
3.3 Mengenfunktion 79
Beispiel mit Löschen doppelter Werte
SELECT Union ([Zeit].[ Kalender ].[Jahr].Members ,[Zeit].[ Kalender ].[Jahr].&[2013],
[Zeit].[ Kalender ].[Jahr].&[2013]) ON COLUMNS ,[ Measures ].[ Umsatzbetrag ] ON ROWS
FROM [ Umsatz ]
Abbildung 3.89: Union() ohne doppelte Werte
Beispiel ohne Löschen doppelter Werte
SELECT Union ([Zeit].[ Kalender ].[Jahr].Members ,[Zeit].[ Kalender ].[Jahr].&[2013],
[Zeit].[ Kalender ].[Jahr].&[2013], All) ON COLUMNS ,[ Measures ].[ Umsatzbetrag ] ON ROWS
FROM [ Umsatz ]
Abbildung 3.90: Union()
3.3.35 VisualTotals()
Die Funktion VisualsTotals gibt eine Menge zurück, welche durch eine dyna-mische Gesamtwertbildung der untergeordneten Elemente einer angegebenenMenge generiert wird. Optional kann in der Ergebnismenge ein Muster fürden Namen des übergeordneten Elements verwendet werden.
VisualTotals()-Syntax
VisualTotals ( Set_Expression [, Pattern ])
Beispiel
SELECTVisualTotals ({[ Produkt ].[ Kategorie ],
80 Kapitel 3 Funktionen
[ Produkt ].[ Kategorie ].&[01],[ Produkt ].[ Kategorie ].&[02]},"* - Visual Totals ") ON COLUMNS ,
[ Measures ].[ Umsatzplan ] ON ROWSFROM [ Umsatz ]
Abbildung 3.91: VisualTotals()
3.4 Logische Funktionen
3.4.1 IsAncestor()
Mit IsAncestor wird überprüft, ob das erste angegebene Element der Vor-gänger des zweiten angegebenen Elements ist.
IsAncestor()-Syntax
IsAncestor ( Member_Expression1 , Member_Expression2 )
Beispiel
WITH MEMBER Measures . Vorgaenger ASIsAncestor ([ Produkt ].[ Sortiment ].[ Kategorie ].[ Backwaren ],
[ Produkt ].[ Sortiment ].[ Subkategorie ].[Brot])SELECT Measures . Vorgaenger ON COLUMNSFROM Umsatz
Es wird bei dieser Abfrage geprüft, ob das Element Backwaren der Vorgängerdes Elements Brot ist.
Abbildung 3.92: IsAncestor()
3.4 Logische Funktionen 81
3.4.2 IsGeneration()
Die Funktion IsGeneration prüft, ob ein angegebenes Element sich in derangegeben Generation befindet. Falls das der Fall ist, gibt die Funktion denWert true zurück. Die Generation wird als numerischer Wert angegeben, wobei1 für die Ebene All steht.
IsGeneration()-Syntax
IsGeneration ( Member_Expression , Generation_Number )
Beispiel
WITH MEMBER Measures . Generation AS IsGeneration ([ Produkt ].[ Sortiment ].[ Kategorie ].[ Milchprodukte ], 2)
SELECT Measures . Generation ON COLUMNSFROM Umsatz
Abbildung 3.93: IsGeneration()
3.4.3 IsLeaf()
Die Funktion IsLeaf gibt an ob es sich bei dem angegeben Element um einBlattelement handelt. Die Funktion gibt true zurück, wenn das angegebeneElement ein Blattelement ist. Andernfalls gibt die Funktion false zurück.
IsLeaf()-Syntax
IsLeaf ( Member_Expression )
Beispiel
WITH MEMBER Measures . Blatt AS IsLeaf ([ Produkt ].[ Sortiment ].[ Produkt ].[Colonial - Bagels ])
SELECT Measures . Blatt ON COLUMNSFROM Umsatz
82 Kapitel 3 Funktionen
Abbildung 3.94: IsLeaf()
3.4.4 IsSibling()
Mit IsSibling wird ermittelt, ob ein angegebenes Element ein gleichgeordne-tes Element des anderen angegebenen Elements ist, d. h. ob die Elemente inder gleichen Hierarchieebene liegen. Die Funktion gibt true zurück, wenn dasangegebene Element ein Blattelement ist. Andernfalls gibt die Funktion falsezurück.
IsSibling()-Syntax
IsSibling ( Member_Expression1 , Member_Expression2 )
Beispiel
WITH MEMBER Measures . Gleichgeorndet ASIsSibling (
[ Produkt ].[ Produkt ].[ Sachsen Milch - Buttermilch ],[ Produkt ].[ Produkt ].[Harry - Bagels ])
SELECT Measures . Gleichgeorndet ON COLUMNSFROM Umsatz
Abbildung 3.95: IsSibling()
3.5 Hierarchiefunktionen
3.5.1 Hierarchy()
Die Funktion Hierarchy gibt die Hierarchie eines angegeben Elements odereiner angegeben Ebene zurück.
Hierarchy()-Syntax
// Elementausdruck :
3.5 Hierarchiefunktionen 83
Member_Expression . Hierarchy// Ebenenausdruck :Level_Expression . Hierarchy
Beispiel
WITH MEMBER Measures .[ Hierarchie ] AS[Zeit].[ Kalender ].[ Quartal ]. Hierarchy .Name
SELECT Measures .[ Hierarchie ] ON COLUMNSFROM [ Umsatz ]
Abbildung 3.96: Hierarchy()
3.5.2 Dimension()
Die Funktion Dimension gibt die Hierarchie zurück, die ein angegebenesElement, Ebene oder Hierarchie enthält.
Dimension()-Syntax
// Hierarchie :Hierarchy_Expression . Dimension// EbeneLevel_Expression . Dimension// Element :Member_Expression . Dimension
Beispiel
WITH MEMBER Measures .[ Dimension ] AS[Zeit].[ Kalender ].[Jahr]. Dimension .Name
SELECT Measures .[ Dimension ] ON COLUMNSFROM [ Umsatz ]
Abbildung 3.97: Dimension()
84 Kapitel 3 Funktionen
3.5.3 Dimensions()
Die Funktion Dimensions gibt die Hierarchie zurück, die durch einen numeri-schen Ausdruck oder einen Zeichenfolgenausdruck angegeben ist.
Dimensions()-Syntax
// Numerische Syntax :Dimensions ( Hierarchy_Number )// String - SyntaxDimensions ( Hierarchy_Name )
Beispiel
WITH MEMBER Measures .[ Dimensions ] ASDimensions ("[ Produkt ].[ Produkt ]"). Name
SELECTMeasures .[ Dimensions ] ON COLUMNS
FROM [ Umsatz ]
Abbildung 3.98: Dimensions()
3.6 Zeichenfolgefunktionen
3.6.1 IIF()
Die Funktion IIF gibt in Abhängigkeit von einem logischen Test einen vonzwei Werten zurück (ähnlich If-else Bedingung anderer Programmiersprachen).Die vom logischen Ausdruck angegebene Bedingung ergibt dann false, wennder Wert dieses Ausdrucks 0 ist. Jeder andere Wert wird zu true ausgewertet.Wenn die Bedingung true ist, gibt die Funktion den ersten Ausdruck zurück,andernfalls den zweiten. Die angegebene Ausdrücke können Werte oder MDX-Objekte zurückgeben. Ferner muss der Typ der angegebenen Ausdrücke nichtübereinstimmen.
IIF()-Syntax
IIf( Logical_Expression , Expression1 , Expression2 )
3.6 Zeichenfolgefunktionen 85
Beispiel
WITH MEMBER Measures . IIFTest ASIIF([ Measures ].[ Umsatzmenge ] > 1400000 ,
" Umsatzmenge hoch", " Umsatzmenge niedrig ")SELECT
{[ Measures ].[ Umsatzmenge ],Measures . IIFTest } ON COLUMNS ,[ Produkt ].[ Kategorie ].[ Kategorie ]. Members ON ROWS
FROM Umsatz
Abbildung 3.99: IIF()
3.6.2 LookupCube()
LookupCube gibt den Wert eines MDX–Ausdrucks zurück, der über einenanderen angegebenen Cube in derselben Datenbank ausgewertet wird.
LookupCube()-Syntax
// Numerische Syntax :LookupCube (Cube_Name , Numeric_Expression )// String - Syntax :LookupCube (Cube_Name , String_Expression )
Beispiel
WITH MEMBER Measures .[ LookUpCube Demo] ASLookUpCube (" Umsatz ", "[ Measures ].[ Um" + " satzmenge ]")SELECT Measures .[ LookUpCube Demo] ON COLUMNSFROM [ Umsatz ]
Abbildung 3.100: LookupCube()
86 Kapitel 3 Funktionen
3.6.3 MemberToStr()
Die Funktion MemberToStr gibt die Zeichenfolge des gesuchten Elementszurück.
MemberToStr()-Syntax
MemberToStr ( Member_Expression )
Beispiel
WITH MEMBER Measures .x AS MemberToStr ( Deutschland )SELECT Measures .x ON COLUMNSFROM Umsatz
Abbildung 3.101: MemberToStr()
3.6.4 Name()
Diese Funktion gibt den Namen einer Hierarchie, Dimension, Ebene oder einesElements zurück.
Syntax
// Dimension :Dimension_Expression .Name// Hierarchie :Hierarchy_Expression .Name// Ebene :Level_Expression .Name// Element :Member_Expression .Name
Beispiel
WITH MEMBER Measures . Dimensionname AS [ Geografie ].NameMEMBER Measures . Hierarchiename AS [ Geografie ].
[ Unternehmen ].[ Bundesland ].&[08]. Hierarchy .NameMEMBER Measures . Levelname AS
[ Geografie ].[ Unternehmen ].[ Bundesland ].&[08]. Level .Name
3.6 Zeichenfolgefunktionen 87
SELECT { Measures . Dimensionname , Measures . Hierarchiename ,Measures . Levelname } ON COLUMNS
FROM Umsatz
Abbildung 3.102: Name()
3.6.5 Properties()
Die Funktion Properties gibt den Wert oder die Zeichenfolge einer Elemen-teigenschaft zurück. Standardmäßig muss der Wert zwingend eine Zeichenfolgesein. Wenn TYPED angegeben wird, ist der Rückgabewert stark typisiert.
Properties()-Syntax
Member_Expression . Properties ( Property_Name [, TYPED ])
Beispiel
WITH MEMBER Measures . MemberID AS [ Geografie ].[ Unternehmen ].[ Bundesland ].&[08]. Properties ("ID")
SELECT { Measures . MemberID } ON COLUMNSFROM Umsatz
Abbildung 3.103: Properties()
3.6.6 UniqueName()
Die Funktion UniqueName ermittelt den eindeutigen Namen einer angegebenenDimension, Hierarchie, Ebene oder Elements. Der zurückgegebene Nameenthält nicht den Namen des Cubes.
UniqueName()-Syntax
// Dimension :
88 Kapitel 3 Funktionen
Dimension_Expression . UniqueName// Hierarchie :Hierarchy_Expression . UniqueName// Ebene :Level_Expression . UniqueName// Element :Member_Expression . UniqueName
Beispiel
WITH MEMBER Measures . GenauerName AS[ Staat ].[ Deutschland ]. UniqueName
SELECT { Measures . GenauerName } ON COLUMNSFROM Umsatz
Abbildung 3.104: UniqueName()
3.6.7 UserName()
Die Funktion UserName gibt den Domänenname und Benutzernamen deraktuellen Verbindung zurück.
UserName()-Syntax
UserName [ ( ) ]
Beispiel
WITH MEMBER Measures . Anwendername AS UsernameSELECT { Measures . Anwendername } ON COLUMNSFROM Umsatz
Abbildung 3.105: UserName()
4 Definitionsanweisungen
4.1 Definition berechneter Elemente
4.1.1 Einführung
Ein berechnetes Element in MDX, ein sog. Measure ist ein Element, welcheseinen Namen besitzt und eine Berechnungsformel enthält. Das bietet in MDXdie Möglichkeit, komplexe Berechnungen von der eigentlichen Abfrage ab-zugrenzen. Die Berechnungsvorschrift wird vor der Abfrage als berechnetesElement festgelegt und kann dann während der Abfrage einfach als Elementaufgerufen werden.
4.1.2 Befehle zur Definition berechneter Elemente
Das berechnete Element wird durch einen Befehl definiert und mit einerMDX-Formel verbunden. Ein berechnetes Element darf keine Kind-Elementebesitzen. Für die Definition von berechneten Elementen existieren die Befehle
WITH MEMBERCREATE MEMBER
Die Formel, die zu dem berechneten Element gehört, kann nur mit Löschenund Neuerstellen des Elements geändert werden.
4.1.3 Definition mittels der WITH-Sektion in Abfragen
Wenn ein berechnetes Element nur für eine einzelne MDX-Abfrage benötigtwird, kann es mit dem WITH-Schlüsselwort definiert werden. Die WITH-Sektionkommt vor dem Schlüsselwort SELECT und bezieht sich nur auf diese Abfrage.Nur berechnete Elemente, benannte Mengen, Zellenberechnungen und zuladende „Cached Data“ können in der WITH-Sektion stehen. Die allgemeine
89
90 Kapitel 4 Definitionsanweisungen
Syntax für das Definieren eines berechneten Elements innerhalb einer Abfragelautet wie folgt:
WITH MEMBER member .name AS ’expression ’ [,optional - property ...]
Tabelle 4.1 gibt einen Überblick zu möglichen optionalen Properties.
Tabelle 4.1: Properties zum Definieren von berechneten Elementen inner-halb einer Abfrage.
Property Bedeutung
SOLVE_ORDER Gibt die Reihenfolge an, in der das berechnete Element inFällen gelöst wird, in denen ein berechnetes Element auf einanderes berechnetes Element verweist (also in Fällen, in denenberechnete Elemente sich überschneiden). Dies tritt zum Bei-spiel auf, wenn benannte Elemente in der Spalte und Zeile auf-treten. Die Berechnung mit der höchsten „SOLVE_ORDER“wird angezeigt.
FORMAT_STRING
Gibt eine Formatzeichenfolge im Microsoft Office-Stil an, diedie Clientanwendung für das Anzeigen von Zellwerten verwen-den kann.
LANGUAGE Sollte der „LCID“ (Language code ID) entsprechen.
VISIBLE Bestimmt, ob das berechnete Element in einem Schemarow-set sichtbar ist. Sichtbare berechnete Elemente können einerMenge mit der AddCalculatedBenannte Mengen-Funktionhinzugefügt werden. Ein Wert ungleich 0 zeigt an, dass dasberechnete Element sichtbar ist. Der Standardwert dieserEigenschaft ist Visible. Berechnete Elemente, die nicht sicht-bar sind (für die dieser Wert auf 0 festgelegt ist), werdenüblicherweise als Zwischenschritte in komplexeren berechne-ten Elementen verwendet. Auf diese berechneten Elementekönnen auch andere Arten von Elementen (z. "B. Measures)verweisen.
NON-EMPTY_BEHAVIOUR
Gibt das Measure oder die Menge an, mit dem oder der beimAuflösen leerer Zellen das Verhalten berechneter Elementebestimmt wird.
4.1 Definition berechneter Elemente 91
Folgendes Beispiel soll verdeutlichen, wie man mit WITH ein berechnetesElement anlegt und wann die SOLVE_ORDER-Property notwendig ist. ImON COLUMNS-Anweisungsteil wird in der letzten Spalte der durchschnittlicheVerkaufspreis berechnet. Im ON ROWS-Anweisungsteil wird in der letzten Zeileberechnet, wie die Veränderung vom 1. Quartal zum 2. Quartal im Jahr 2014war.
Beispiel mit SOLVE_ORDER
WITH MEMBER [ Measures ].[ Durchschn . Verkaufspreis ] AS"[ Measures ].[ kumulierter Umsatz ]/[ Measures ].
[ Umsatzmenge ]", SOLVE_ORDER = 0MEMBER [Zeit].[ Quartal ].[Q1 zu Q2 Wachstum ] AS "[Zeit ].
[ Quartal ].&[201402] - [Zeit ].[ Quartal ].&[201401]",SOLVE_ORDER =1
SELECT {[ Measures ].[ kumulierter Umsatz ], [ Measures ].[ Umsatzmenge ], [ Measures ].[ Durchschn . Verkaufspreis ]}
ON COLUMNS ,{[Zeit].[ Quartal ].&[201401], [Zeit].[ Quartal ].&[201402],
[Zeit].[ Quartal ].[Q1 zu Q2 Wachstum ]} ON ROWSFROM [ Umsatz ]
Abbildung 4.1: Definieren berechneter Elemente mit WITH
4.1.4 Definition mittels CREATE MEMBER
Mit CREATE MEMBER können berechnete Elemente server- oder clientseitig fürdie Sitzung erstellt werden. Diese berechneten Elemente sind während dergesamten Sitzung verfügbar sind und somit in mehreren Abfragen im Verlaufder Sitzung wieder verwendbar. Notwendig sind dabei der Name des Cubesund die Namen der Dimensionen. Die allgemeine Syntax lautet
CREATE MEMBER cube. member .name AS " expression " [,optional - property ...]
92 Kapitel 4 Definitionsanweisungen
Die Properties, die man in der Anweisung angeben kann, sind dieselben wiebei der Definition mittels WITH in Tabelle 4.1.
Erstellen des berechneten Elements
Das berechnete Element [Abweichung Plan_Ist] wird für den Cube Umsatzerzeugt. Es ist nur in diesem Cube sichtbar und für jede Abfrage während dergesamten Sitzungsdauer nutzbar.
Beispiel
CREATE MEMBER [ Umsatz ].[ Measures ].[ Abweichung Plan_Ist ] AS"[ Measures ].[ Umsatzbetrag ] - [ Measures ].[ Umsatzplan ]",
SOLVE_ORDER = 1, FORMAT_STRING = "#.##"
Löschen eines berechneten Elements
Da man die Formel eines berechneten Elements nicht nachträglich ändernkann, muss das Element erst gelöscht und mit der neuen Formel wieder erstelltwerden. Die allgemeine Syntax für das Löschen eines berechneten Elementslautet
DROP MEMBER cube. member .name [, cube. member .name ...]
Im folgenden Beispiel wird die berechnete Differenz zwischen Ist- undPlanumsatz gelöscht.
DROP MEMBER [ Umsatz ].[ Measures ].[ Abweichung Plan_Ist ]
5 Häufige Berechnungen undSelect-Anweisungen in MDX
MDX kann unter anderem für folgende Analysen genutzt werden:
• Trends in der Qualität der Herstellung,
• Trends bei Versicherungsansprüchen,
• Prognose und Analyse Kaufverhalten,
• Affiliateprodukte, . . .
Doch wie werden häufige Berechnungen und Abfragen in MDX ausgedrückt?Dieses Kapitel stellt Lösungsansätze für gewisse Sachverhalte vor. Die Lösungs-vorschläge in dem dargestellten Kapitel hängen natürlich stark vom Aufbaudes Cubes ab. Daher müssen die Berechnungen teilweise anders formuliertwerden.
5.1 Filter- und Sortierfunktionen
Mit Filter- und Sortierfunktionen lässt sich die Darstellungsqualität der Anfra-geergebnisse deutlich verbessern. Die Sortierfunktion TopCount (vgl. Abschnitt3.3.31) bietet z. B. die Möglichkeit, die Werte der Ergebnismenge absteigendzu sortieren, um so Produkte mit dem höchsten Verkaufsumsatz schneller undbesser identifizieren zu können.
Beispiel
SELECT TopCount ({[ Produkt ].[ Sortiment ].[ Kategorie ].[ Fleisch ]. Children
* [Zeit].[Jahr].&[2014]}, 3, [ Measures ].[ Umsatzbetrag ])
93
94 Kapitel 5 Häufige Berechnungen und Select-Befehle
ON COLUMNS ,[ Geografie ].[ Unternehmen ].[ Staat ]. Members ON ROWS
FROM [ Umsatz ]
Mit dieser Abfrage werden die besten drei Verkaufsumsätze der Produkt-subkategorien in der Kategorie Fleisch in allen Staaten dargestellt.
Abbildung 5.1: TopCount()
Analog lassen sich mit der Funktion BottomCount (vgl. Abschnitt 3.3.5) dieumsatzschwächsten Produkte filtern. Weitere wichtige Funktionen in diesemZusammenhang sind die Funktionen Filter (Abschnitt 3.3.18), TopPercent
(Abschnitt 3.3.32) sowieTopSum (Abschnitt 3.3.33).
5.2 Berechnung des prozentualen Anteils nachSchema X / Y
Exemplarisch wird im folgenden Beispiel die Berechnung der prozentualenAnteile der Umsatzbeträge für die Kategorien Backwaren, Fleisch und Milch-produkte am Gesamtumsatz gezeigt (Abb. 5.2, S. 95).
Prozentualer Anteil einer Kategorie am Gesamtumsatz
WITH MEMBER [ Measures ].[ Anteil Kategorie am Gesamtumsatz ]AS "([ Measures ].[ Umsatzbetrag ]) / ([ Measures ].
[ Umsatzbetrag ], [ Produkt ].[ Kategorie ].[ All ])"SELECT {[ Measures ].[ Anteil Kategorie am Gesamtumsatz ],
[ Measures ].[ Umsatzbetrag ]} ON COLUMNS ,{ NONEMPTY ([ Produkt ].[ Kategorie ]. Members )} ON ROWS
FROM [ Umsatz ]
Im Folgenden sind Abfrage und Ergebnis für die Berechnung der prozen-tualen Anteile der Umsatzbeträge in den Subkategorien bezogen auf dieentsprechenden Kategorien gezeigt (Abb. 5.3, S. 95).
5.2 Berechnung des prozentualen Anteils 95
Abbildung 5.2: Prozentualer Anteil einer Kategorie am Gesamtumsatz
Prozentualer Anteil einer Subkategorie am Umsatz der Kategorie
WITH MEMBER [ Measures ].[ Umsatzanteil der Subkategorie an Kategorie ] AS
"([ Measures ].[ Umsatzbetrag ] * 100) / ([ Measures ].[ Umsatzbetrag ], [ Produkt ].[ Kategorie ])",FORMAT_STRING =" ###.00\% "
SELECT{[ Measures ].[ Umsatzanteil der Subkategorie an Kategorie ],
[ Measures ].[ Umsatzbetrag ]} ON COLUMNS ,{ NONEMPTY ([ Produkt ].[ Kategorie ]. Children *
[ Produkt ].[ Subkategorie ]. Children )} ON ROWSFROM [ Umsatz ]
Abbildung 5.3: Prozentualer Umsatzanteil einer Subkategorie an der Ka-tegorie
96 Kapitel 5 Häufige Berechnungen und Select-Befehle
5.3 Berechnung des einfachen Durchschnitts
Den einfachen Durchschnitt kann man entweder über einer Formel, wie
[ Measures ].[ Sales Sum] / [ Measures ].[Item Count ]
oder auch mit der expliziten bzw. impliziten Funktion Avg (Abschnitt 3.2.2) bil-den. Mit der folgenden MDX-Anweisung wird der durchschnittliche Stückpreisfür die jeweiligen Kategorien in den Dimensionen Staat und Zeit berechnet.
Beispiel
WITH MEMBER [ Measures ].[Avg Stü ckpreis ] AS"[ Measures ].[ Umsatzbetrag ]/[ Measures ].[ Umsatzmenge ]"
SELECT {[Zeit].[Jahr]. Children } ON COLUMNS ,{ NONEMPTY ([ Geografie ].[ Staat ]. Children *
[ Produkt ].[ Kategorie ]. Children ) } ON ROWSFROM [ Umsatz ]WHERE [ Measures ].[Avg Stü ckpreis ]
Abbildung 5.4: Einfacher Durchschnitt
5.4 Zeitbezug und Zeitraumberechnung 97
5.4 Zeitbezogenen Referenzierungen undZeitraumberechnungen
5.4.1 Periode-zu-Periode Referenzierungen undBerechnungen
Um auf die Daten eines vorhergehenden Zeitraumes zuzugreifen, wird dieFunktion PrevMember (siehe Abschnitt 3.1.20) genutzt. Um Daten des nach-folgenden Zeitraumes zu verwenden, wird die Funktion NextMember (sieheAbschnitt 3.1.16) verwendet.
Die folgende Anweisung gibt quartalsweise die Umsatzmengen aus, sowiedie Differenzen zum vorangegangenen Quartal.
WITH MEMBER [ Measures ].[Ä nderung zur Vorperiode ] AS"[ Measures ].[ Umsatzmenge ] - ([ Measures ].[ Umsatzmenge ],
[Zeit ].[ Quartal ]. CurrentMember . PrevMember )"SELECT {[Zeit].[ Quartal ]. Children } ON COLUMNS ,
{[ Measures ].[ Umsatzmenge ], [ Measures ].[Ä nderung zur Vorperiode ]} ON ROWS
FROM [ Umsatz ]
Abbildung 5.5: Umsatzmengenänderung zum folgenden Quartal
5.4.2 Laufender Durchschnitt und „52-Wochen-Hoch /-Tief“
Solche berechneten Werte gehören zur Klasse der sich bewegenden Aggrega-tionen. Dabei wird ein Measure über ein sich bewegendes Fenster aggregiert.Die Endpunkte der Zeitspanne werden dabei immer relativ zum aktuellenElement angegeben.
Um auf Elemente relativ zum aktuellen Element zuzugreifen, kann man eineReihe von Operatoren und Funktionen verwenden, wie den Bereichsoperator(„:“, Abschnitt 2.1.4) oder eine der Funktionen Lag (Abschnitt 3.1.10), Lead
98 Kapitel 5 Häufige Berechnungen und Select-Befehle
(Abschnitt 3.1.13), PrevMember (Abschnitt 3.1.20), NextMember (Abschnitt3.1.16), Cousin (Abschnitt 3.1.3), ParallelPeriod (Abschnitt 3.1.18) etc.
Im den folgenden beiden Varianten mit Lag und LastPeriods wird sich beider Abfrage der Umsatzmenge in der Kategorie Backwaren um sechs Perioden(hier Quartale) zurück bewegt (Abb. 5.6).// Variante 1:WITH MEMBER Measures .[Avg Zeit] AS
Avg (([Zeit].[ Quartal ].&[201404].Lag (5) : [Zeit].[Zeit].[ Quartal ].&[201404]), Measures .[ Umsatzmenge ])
SELECT Measures .[Avg Zeit] ON COLUMNS ,{[ Produkt ].[ Kategorie ].[ Backwaren ]} ON ROWS
FROM [ Umsatz ]// Variante 2:WITH MEMBER Measures .[Avg Zeit] AS
Avg( LastPeriods (6, [Zeit].[ Quartal ].&[201404]),Measures .[ Umsatzmenge ])
SELECT Measures .[Avg Zeit] ON COLUMNS ,{[ Produkt ].[ Kategorie ].[ Backwaren ]} ON ROWS
FROM [ Umsatz ]
Abbildung 5.6: Laufender Durchschnitt über 6 Perioden
Die nachfolgenden MDX-Abfragen ermitteln den Durchschnitt über denaktuellen und vorherigen Zeitraum unter Verwendung des Bereichsoperators„:“ mit den Funktionen PrevMember bzw. Lag (Abb. 5.7, S. 99). Die Zeiträumehängen vom verwendeten Ebenenausdruck ab.// Variante mit Lag ()- FunktionWITH MEMBER Measures .[Avg Zeit] AS Avg ({[Zeit].[ Monat ].
&[201409].Lag (1) : [Zeit].[ Monat ].&[201409]},[ Measures ].[ Umsatzbetrag ])
SELECT Measures .[Avg Zeit] ON COLUMNS ,{[ Produkt ].[ Kategorie ].[ Backwaren ]} ON ROWS
FROM [ Umsatz ]// Variante mit PrevMember ()- FunktionWITH MEMBER Measures .[Avg Zeit] AS Avg ({[Zeit].[ Monat ].
&[201409]. PrevMember : [Zeit].[ Monat ].&[201409]},[ Measures ].[ Umsatzbetrag ])
5.4 Zeitbezug und Zeitraumberechnung 99
SELECT Measures .[Avg Zeit] ON COLUMNS ,{[ Produkt ].[ Kategorie ].[ Backwaren ]} ON ROWS
FROM [ Umsatz ]
Abbildung 5.7: Laufender Durchschnitt über zwei Perioden
Über das folgende Codefragment können Quartale zu Halbjahren zusammen-gefasst werden.
Avg( ParallelPeriod ( [Zeit].[ Quartal ], 2,[Zeit]. CurrentMember : [Zeit]. CurrentMember ),
Measures .[ Umsatzmenge ])
Die unten aufgeführten Anweisungen ermitteln das „52-Wochen-Hoch“ („52-Week High“-Wert). Dabei ist darauf zu achten, dass man sich auf der Wo-chenebene bewegt.
Max ({[Zeit].Lag (51) : [Zeit]}, [ Measures ].[ Share Price ])Max (( LastPeriods (52 , [Zeit])), [ Measures ].[ Share Price ])
Literaturhinweise
Dieses Handbuch kann den kompletten Umfang der mächtigen MDX-Sprachenicht darstellen, sondern fasst wesentliche Grundlagen zusammen und veran-schaulicht diese anhand von Abfragebeispielen auf den in der BI-Lehrveran-staltung genutzten Cube. Daher sind folgend Quellen zum vertieften Einstiegin MDX aufgeführt.
Lehre
• Prof. Dr.-Ing. Axel Toll. Lehrveranstaltung „Business Intelligence“,Diplom- und Bachelor-Studiengänge Wirtschaftsinformatik an der HTWDresden, 4. Semester. Homepage: http://www2.htw-dresden.de/~toll/
(abgerufen am 4. November 2015).
OLAP-Werkzeuge
• Die im Handbuch dargestellten Abfragen wurden mit den MicrosoftSQL Server 2012 Analysis Services auf Basis der MDX-Referenz vonMicrosoft (s. u., Internetquellen) erstellt.
• Zur Aufbereitung und Anreicherung der Data Warehouse-Daten (insb.Anlegen des Cubes mit Dimensionen, Measures etc.) wurde MicrosoftVisual Studio 2010 mit der Business Intelligence-Vorlage erstellt.
Bücher
• M. Whitehorn, R. Zare, M. Pasumansky. Fast Track to MDX. Sprin-ger. 2. Auflage 2006. ISBN 978-1846281747. Das schlanke Einstiegswerk
101
102 Literaturhinweise
befasst sich mit Grundlagen von MDX-Abfragen und erläutert häufigverwendete Funktionen.
• S. Harinath et al. Professional Microsoft SQL Server 2012 Ana-lysis Services with MDX and DAX. Wiley & Sons, 1. Auflage 2012.ISBN 978-1118101100. Das umfangreiche Handbuch für MS SQL ServerAnalysis Services.
Internetquellen• Multidimensional Expressions (MDX) - Referenz von Microsoft. Adresse:
https://msdn.microsoft.com/en-us/library/ms145506.aspx. DieseSeite enthält sowohl eine Beschreibung der Syntaxelemente für MDX-Ausdrücke, -Anweisungen und -Skripte als auch die MDX-Sprachreferenzmit Erläuterungen zu Anweisungen, Operatoren und Funktionen derMDX-Sprache (abgerufen am 4. November 2015).
• MDX-Tutorial und -Blog auf Deutsch. Adresse: http://www.mdx-hilfe.
de/mdx-tutorial/. Ein anschaulich gestalteter Einstieg in die Arbeitmit OLAP-Cubes und Grundlagen von MDX (abgerufen am 4. November2015).
• MDX-Dokumentation und Tutorial auf Englisch: http://www.iccube.
com/support/documentation/mdx/index.php. Eine umfangreiche An-leitung mit zahlreichen Beispielen (abgerufen am 4. November 2015).
Sachregister
Aggregate, 31AllMembers, 50Ancestor, 17Ancestors, 51Ascendants, 52Attribut, 2, 9Avg, 33Axis, 53
BottomCount, 54BottomPercent, 54BottomSum, 55
Children, 56ClosingPeriod, 18Correlation, 34Count, 35Cousin, 19Covariance, 37CovarianceN, 38Crossjoin, 56Cube, 2CurrentMember, 20
DataMember, 20DefaultMember, 21
Descendants, 58Dimension, 2, 9, 83Dimensions, 84Distinct, 61DistinctCount, 38DrilldownMember, 62DrilldownMemberBottom, 63DrilldownMemberTop, 64DrillupLevel, 65
Ebene, 2Element, 2Except, 65Exists, 66
Fakt, 2Filter, 67FirstChild, 21FirstSibling, 22
Head, 68Hierarchie, 2Hierarchize, 68Hierarchy, 82
IIF, 84IsAncestor, 80
103
104 Sachregister
IsGeneration, 81IsLeaf, 81IsSibling, 82Item, 23
Kennzahl, 2
Lag, 23LastChild, 24LastPeriods, 69LastSibling, 25Lead, 25Level, 2, 9LinkMember, 26LinRegIntercept, 39LinRegPoint, 40LinRegR2, 41LinRegSlope, 41LinRegVariance, 42LookupCube, 85
Max, 43MDX, 1Measure, 89Measures, 2, 9Median, 44Members, 2, 9, 27, 71MemberToStr, 86Menge, 13Min, 44
Name, 86NameToSet, 72NextMember, 27
OpeningPeriod, 28
Order, 72Ordinal, 45
ParallelPeriod, 28Parent, 29PeriodsToDate, 73PrevMember, 29Properties, 87
Rank, 45
Set, 13Siblings, 73Slice, 11Stddev, 46StddevP, 47Stdev, 46StdevP, 47StripCalculatedMembers, 74StrToMember, 30StrToSet, 74Subset, 75Sum, 47
Tail, 76TopCount, 76TopPercent, 77TopSum, 78Tupel, 11
Union, 78UniqueName, 87UnknownMember, 31UserName, 88
Value, 48
Sachregister 105
Var, 49Variance, 49VarianceP, 49VarP, 49VisualTotals, 79