28 MDX-Abfragen schreiben

MDX ist eine SQL-ähnliche Sprache, mit der Sie Abfragen ausführen können, die Daten aus Essbase abrufen. MDX wird auch verwendet, um Formeln in ASO-Cubes zu definieren, Metadaten abzufragen, Elementnamen zu qualifizieren und Teilmengen von Daten oder Metadaten zu trennen. Der beste Weg, MDX zu lernen, ist Abfragen zu schreiben.

In diesem Abschnitt lernen Sie MDX kennen, indem Sie Abfragen für den Sample Basic-Cube in einer Reihe von Übungen erstellen.

Voraussetzungen für das Schreiben von MDX-Abfragen

Um die Übungen abzuschließen, benötigen Sie:

  • einen Texteditor, um die MDX-Abfragen zu schreiben.

  • Zugriff auf eine Essbase-Instanz mit Beispielbasis.

    Wenn Sie "Beispielbasis" abrufen müssen, führen Sie die Schritte unter Beispiel-Cube erstellen, um Gliederungseigenschaften zu untersuchen aus. (Führen Sie einfach den Import aus, und überspringen Sie die Festlegung der Gliederungseigenschaften.)

  • MaxL-Client, um die Abfragen an Essbase auszugeben.

MDX-Abfragevorlage erstellen

Lernen Sie das grundlegende Format einer MDX-Abfrage kennen, damit Sie MDX mit Essbase verwenden können. Ähnlich wie bei SQL-Anweisungen beginnen MDX-Abfragen normalerweise mit SELECT.

In diesem Abschnitt erstellen Sie eine Vorlage, die als Grundlage für die Entwicklung einfacher MDX-Abfragen verwendet werden kann.

Die meisten Abfragen können auf dem folgenden grammatikalischen Framework basieren:

SELECT
  {}
ON COLUMNS
FROM Sample.Basic

SELECT in Zeile 1 ist das Schlüsselwort, das den Hauptteil der MDX-Anweisungen beginnt.

Die geschweiften Klammern { } in Zeile 2 sind Platzhalter für ein Set. In der obigen Abfrage ist das Set leer, die geschweiften Klammern bleiben jedoch als Platzhalter erhalten.

Übung 1: MDX-Abfragevorlage erstellen

So erstellen Sie eine Abfragevorlage:

  1. Erstellen Sie einen Ordner, in dem Beispielabfragen gespeichert werden, die für den Cube Sample.Basic ausgeführt werden können.

  2. Geben Sie in einem Texteditor den folgenden Code in eine leere Datei ein:

    SELECT
      {}
    ON COLUMNS
    FROM Sample.Basic
  3. Speichern Sie die Datei unter qry_blank.txt.

MDX-Sets und -Tupel

MDX-Sätze enthalten Tupel und MDX-Tupel enthalten Elementnamen. Lernen Sie den Unterschied zwischen Sets, Tupeln und Elementnamen kennen und erfahren Sie, wie sie in Essbase MDX-Abfragen passen.

Erstellen Sie die erste Abfrage, und führen Sie sie im MaxL-Client aus, um einige Daten aus dem Sample Basic-Cube abzurufen.

sets

Ein MDX-Set kann leer sein, eine Gruppe von Tupeln oder eine Gruppe von Sets sein.

Beispiel: Das Folgende ist ein leeres Set.

{ }

Ein Set muss in geschweifte Klammern {} eingeschlossen sein, außer in Fällen, in denen das Set durch eine MDX-Funktion dargestellt wird, die ein Set zurückgibt (mehr zu Funktionen später).

Das folgende Set besteht aus einem Tupel.


  {[Cola]}

In der folgenden Abfrage ist {([Cola], [Actual])} auch ein Set, das aus einem Tupel besteht. In diesem Fall hat das Tupel jedoch mehr als einen Elementnamen.

SELECT
  {([Cola], [Actual])}
ON COLUMNS
FROM Sample.Basic

{([Cola], [Actual])} ist ein Tupel, das aus zwei Elementen (Cola und Actual) aus zwei Dimensionen (Product und Scenario) besteht.

Dimensionalitätsregel

Wenn ein Set mehrere Tupel enthält, müssen die Elemente jedes Tupels dieselben Essbase-Dimensionen in derselben Reihenfolge darstellen. Das heißt, alle Tupel müssen dieselbe Dimensionalität wie die anderen aufweisen.

  • OK: Das folgende Set besteht aus zwei Tupeln derselben Dimensionalität:

    {(West, Feb), (East, Mar)}
  • Nicht in Ordnung: Das folgende Set bricht die Dimensionalitätsregel, da Feb und Sales aus verschiedenen Dimensionen stammen:

    {(West, Feb), (East, Sales)}
  • Nicht OK: Das folgende Set bricht die Dimensionalitätsregel auf, da die beiden Tupel zwar dieselben Dimensionen enthalten, aber die Reihenfolge der Dimensionen im zweiten Tupel umgekehrt wird:

    {(West, Feb), (Mar, East)}

Tupel und Elementnamen

Ein Tupel ist eine Möglichkeit, ein Element oder eine Elementkombination aus einer beliebigen Anzahl von Dimensionen zu referenzieren. Beispiel: Im Cube "Sample.Basic" sind alle diese gültigen Tupel gültig:

  • Jan
  • (Jan, Sales)
  • ([Jan],[Sales],[Cola],[Utah],[Actual])

Die Elementnamen können wie folgt angegeben werden:

  • Durch Angabe des tatsächlichen Namens oder Alias. Beispiel:

    • Cola

    • Actual

    • COGS

    • [100]

    Wenn der Elementname mit einer Zahl beginnt oder Leerzeichen enthält, muss er sich in Klammern befinden. Beispiel: [100] oder [New York]. Die Klammern für Elementnamen werden jedoch für alle Elementnamen empfohlen, um Klarheit und Lesbarkeit des Codes zu gewährleisten.

    Wenn der Elementname mit einem Et-Zeichen (&) beginnt, muss er in Anführungszeichen stehen. Beispiel: ["&xyz"]. Dies liegt daran, dass das führende Et-Zeichen für Substitutionsvariablen reserviert ist (siehe Variablen in MDX-Abfragen). Sie können sie auch als StrToMbr("&100") angeben.

    Für Attributelemente muss der lange Name (der zur eindeutigen Identifizierung des Elements qualifiziert ist) verwendet werden. Beispiel: [Ounces_12] anstelle von [12].

  • Indem Sie den Dimensionsnamen oder einen der Namen der übergeordneten Elemente als Präfix für den Elementnamen angeben, z.B. [Product].[100-10] und [Diet].[100-10]. Diese Übung wird für alle Elementnamen empfohlen, da sie Unklarheiten beseitigt und es Ihnen ermöglicht, sich genau auf gemeinsame Elemente zu beziehen. Siehe: "Mitglieder durch Differenzierung des Vorgängers qualifiziert" unter Doppelte Elementnamen in Gliederungen.

    Hinweis:

    Verwenden Sie nicht mehrere Vorgänger in der Elementnamensqualifikation. Essbase gibt einen Fehler zurück, wenn mehrere Vorgänger enthalten sind. Beispiel: [Market].[New York] und [East].[New York] sind gültige Namen für New York. [Market].[East].[New York] gibt jedoch einen Fehler zurück.

  • Geben Sie den Namen eines berechneten Elements an, das im WITH-Abschnitt definiert ist.

Übung 2: Erste Abfrage ausführen

Denken Sie daran, dass die geschweiften Klammern {} in Zeile 2 Ihrer Abfragevorlage ein Platzhalter für ein Set sind. In dieser Übung fügen wir der Abfrage ein Set hinzu und führen es aus.

So führen Sie die Abfrage durch:

  1. Öffnen Sie qry_blank.txt, die Abfragevorlage, die Sie unter MDX-Abfragevorlage erstellen erstellt haben.

  2. Da ein Set so einfach sein kann wie ein Tupel, fügen Sie das Tupel in den geschweiften Klammern { } hinzu, die das Set enthalten.

    Geben Sie [Jan] in die geschweiften Klammern { } in Zeile 2 ein:

    SELECT 
      {[Jan]}
    ON COLUMNS
    FROM Sample.Basic
  3. Speichern Sie die Abfrage unter qry_first.txt.

  4. Stellen Sie sicher, dass Essbase ausgeführt wird.

  5. Starten Sie den MaxL-Client, und melden Sie sich mit einem gültigen Benutzernamen und Kennwort an. Beispiel:

    login admin1 my_Pa55w0rD on "https://myserver.example.com:9001/essbase/agent";
  6. Kopieren Sie die gesamte SELECT-Abfrage, und fügen Sie sie in den MaxL-Client ein. Drücken Sie jedoch noch nicht die Eingabetaste.

  7. Geben Sie ein Semikolon am Ende an einer beliebigen Stelle nach "Einfach" ein, bevor Sie die Eingabetaste drücken. (Das Semikolon ist keine MDX-Anforderung, sondern vom MaxL-Client erforderlich, um das Ende einer Anweisung anzugeben.)

  8. Drücken Sie die Eingabetaste, um die Abfrage an Essbase zu senden.

    Die Ergebnisse sollten wie folgt aussehen:

    Jan
      8024

MDX-Abfragelayout mit Achsen und Cube-Spezifikation

Eine MDX-Achse ist eine Anweisung, die das Rasterlayout der Abfrageergebnisse aus einem Essbase-Cube formt. ON COLUMNS und ON ROWS sind Achsenschlüsselwörter, die beschreiben, wo die Ergebnisse angezeigt werden sollen. Eine Cube-Spezifikation enthält das Schlüsselwort FROM und gibt Essbase an, welcher Cube abgefragt werden soll.

MDX-Achse

Achsen passen nach der Auswahl in MDX-Abfragen:

SELECT <axis> [, <axis>...]
FROM <database> 

In der folgenden Abfrage lautet die Achsenspezifikation {Jan} ON COLUMNS:

SELECT
  {Jan} ON COLUMNS
FROM Sample.Basic

In jeder MDX-Abfrage muss mindestens eine Achse angegeben werden.

Es können bis zu 64 Achsen angegeben werden, beginnend mit AXIS(0) und weiter mit AXIS(1)... AXIS(63). Die Verwendung von mehr als drei Achsen ist ungewöhnlich. Die Reihenfolge der Achsen ist nicht wichtig. Wenn jedoch eine Gruppe von Achsen 0 bis n angegeben wird, darf keine Achse zwischen 0 und n übersprungen werden. Außerdem kann eine Dimension nicht auf mehreren Achsen angezeigt werden.

Die ersten fünf Achsen haben Schlüsselwortaliasnamen, wie in der folgenden Tabelle aufgeführt:

Tabelle 28-1: Schlüsselwortaliasnamen für Achsen

Schlüsselwortalias für Achsen Achsen

IN SPALTEN

Kann anstelle von AXIS(0) verwendet werden

IN ZEILEN

Kann AXIS(1) ersetzen

AUF SEITEN

Kann AXIS(2) ersetzen

AUF KAPITELN

Kann AXIS(3) ersetzen

ABSCHNITTE

Kann AXIS(4) ersetzen

MDX-Cube - Spezifikation

Eine Cube-Spezifikation ist der Teil der Abfrage, der bestimmt, welche Essbase-Datenbank abgefragt wird. Die Cube-Spezifikation passt wie folgt in eine MDX-Abfrage:

SELECT <axis> [, <axis>...]
FROM <cube> 

Der Abschnitt <cube> folgt dem Schlüsselwort FROM und sollte aus durch Trennzeichen getrennten oder nicht durch Trennzeichen getrennten Bezeichnern bestehen, die zuerst einen Anwendungsnamen und dann einen Datenbanknamen angeben. Beispiel: Die folgenden Spezifikationen sind gültig:

  • FROM Sample.Basic

  • FROM [Sample.Basic]

  • FROM [Sample].[Basic]

  • FROM'Sample'.'Basic'

Übung 3: Zwei-Achsen-Abfrage ausführen

So führen Sie eine Abfrage mit zwei Achsen aus:

  1. Öffnen Sie qry_blank.txt, die Abfragevorlage, die Sie unter MDX-Abfragevorlage erstellen erstellt haben.

  2. Fügen Sie nach ON COLUMNS ein Komma hinzu, und fügen Sie dann einen Platzhalter für eine zweite Achse hinzu, indem Sie ON ROWS hinzufügen:

    SELECT
      {}
    ON COLUMNS,
      {}
    ON ROWS
    FROM Sample.Basic
  3. Speichern Sie die neue Abfragevorlage unter qry_blank_2ax.txt.

  4. Geben Sie als Set-Spezifikation für die Spaltenachse die Produktelemente 100-10 und 100-20 ein. Beispiel:

    SELECT
      {[100-10],[100-20]}
    ON COLUMNS, 
      {}
    ON ROWS
    FROM Sample.Basic

    Da diese Elementnamen Sonderzeichen enthalten, müssen Sie Klammern verwenden. Es wird empfohlen, alle Elementnamen in Klammern einzuschließen, auch wenn sie keine Sonderzeichen enthalten.

  5. Geben Sie als Set-Spezifikation für die Zeilenachse die Year-Elemente Qtr1 bis Qtr4 ein.

    SELECT
      {[100-10],[100-20]}
    ON COLUMNS,
      {[Qtr1],[Qtr2],[Qtr3],[Qtr4]}
    ON ROWS
    FROM Sample.Basic
  6. Speichern Sie die Abfrage unter qry_2ax.txt.

  7. Fügen Sie die Abfrage in den MaxL-Client ein, und führen Sie sie aus, wie in der ersten Übung (in MDX-Sets und -Tupeln) beschrieben.

Die Ergebnisse der Abfrage sollten wie folgt aussehen:

Tabelle 28-2: Ergebnisse: Zwei-Achsen-Abfrage ausführen

Bild eines Bereichs wird für leere thead-Zellen verwendet 100-10 100-20

Qrt 1

5.096

1.359

Quartal 2

5.892

1.534

Quartal 3

6.583

1.528

Quartal 4

5.206

1.287

Übung 4: Mehrere Dimensionen auf einer Achse abfragen

So fragen Sie mehrere Dimensionen auf einer einzelnen Achse ab:

  1. Öffnen Sie qry_blank_2ax.txt, die Abfragevorlage, die Sie in der vorherigen Übung erstellt haben.

  2. Geben Sie auf der Spaltenachse zwei Tupel an, von denen jedes eine Elementkombination und kein einzelnes Element ist. Schließen Sie jedes Tupel in Klammern ein, da in jedem Tupel mehrere Elemente dargestellt werden.

    SELECT
      {([100-10],[East]), ([100-20],[East])}
    ON COLUMNS,
      {}
    ON ROWS
    FROM Sample.Basic
  3. Geben Sie auf der Zeilenachse vier Tupel mit zwei Elementen an, die jedes Quartal mit Profit verschachteln:

    SELECT
      {([100-10],[East]), ([100-20],[East])}
    ON COLUMNS,
      {
      ([Qtr1],[Profit]), ([Qtr2],[Profit]),
      ([Qtr3],[Profit]), ([Qtr4],[Profit])
      }
    ON ROWS
    FROM Sample.Basic
  4. Speichern Sie die Abfrage unter qry_1ax.txt.

  5. Fügen Sie die Abfrage in den MaxL-Client ein, und führen Sie sie aus, wie in der ersten Übung (in MDX-Sets und -Tupeln) beschrieben.

    Die Ergebnisse sollten wie folgt aussehen:

    Tabelle 28-3: Ergebnisse: Mehrere Dimensionen auf einer Achse abfragen

    Bild eines Bereichs wird für leere thead-Zellen verwendet Bild eines Bereichs wird für leere thead-Zellen verwendet 100-10 100-20
    Bild eines Bereichs wird für leere thead-Zellen verwendet Bild eines Bereichs wird für leere thead-Zellen verwendet

    Ost

    Ost

    Qrt 1

    Gewinn

    2.461

    212

    Quartal 2

    Gewinn

    2.490

    303

    Quartal 3

    Gewinn

    3.298

    312

    Quartal 4

    Gewinn

    2.430

    287

MDX-Funktionen zum Erstellen von Sets verwenden

Mit MDX-Funktionen können Sie Essbase-Metadaten oder -Daten bearbeiten. Funktionen können Elemente, Sets, Werte, Tupel oder Zeichenfolgen zurückgeben. Sie sind nützlich, unabhängig davon, ob Sie MDX zum Analysieren, Aktualisieren oder Exportieren von Daten verwenden.

Erfahren Sie, wie Sie MemberRange- und CrossJoin-Funktionen verwenden, indem Sie die Übungen ausprobieren.

Diese Einführung in MDX-Funktionen konzentriert sich auf einige Funktionen, die Sätze generieren. Anstatt Sätze Element für Element oder Tupel für Tupel manuell in eine MDX-Abfrage einzugeben, können Sie solche Aufzählungen durch einen einfachen Funktionsausdruck ersetzen. MDX-Funktionen können Sets sowie andere Werte zurückgeben.

Untergeordnete Elemente sind beispielsweise eine Set-Funktion. Gibt die Gruppe der untergeordneten Elemente des Eingabeelements zurück. Daher gibt Children(Qtr1) {Jan, Feb, Mar} zurück.

Die folgenden Übungen können Ihnen helfen, MDX-Funktionen in einfachen Abfragen zu verwenden. Eine vollständige Referenz der von Essbase unterstützten MDX-Funktionen finden Sie unter MDX-Funktionsliste.

Übung 5: Funktion MemberRange verwenden

Die MemberRange MDX-Funktion gibt einen Bereich von Elementen zurück, einschließlich und zwischen zwei angegebenen Elementen derselben Generation. Die Syntax lautet wie folgt:

MemberRange (<member1>, <member2>, [,<layertype>])

wobei das erste angegebene Argument das Element ist, das den Bereich beginnt, und das zweite Argument das Element ist, das den Bereich beendet. Das Argument layertype ist optional.

Hinweis:

Eine alternative Syntax für MemberRange besteht darin, einen Doppelpunkt zwischen den beiden Elementen zu verwenden, anstatt den Funktionsnamen zu verwenden: member1 : member2.

So verwenden Sie die Funktion MemberRange:

  1. Öffnen Sie qry_blank.txt, die Abfragevorlage, die Sie unter MDX-Abfragevorlage erstellen erstellt haben.

  2. Löschen Sie die geschweiften Klammern {}, die nicht erforderlich sind, wenn Sie eine Funktion verwenden, um das Set zurückzugeben.

  3. Verwenden Sie den Doppelpunktoperator, um einen Elementbereich von Qtr1 bis Qtr4 auszuwählen:

    SELECT 
      [Qtr1]:[Qtr4]
    ON COLUMNS 
    FROM Sample.Basic
  4. Fügen Sie die Abfrage in den MaxL-Client ein, und führen Sie sie aus, wie in der ersten Übung (in MDX-Sets und -Tupeln) beschrieben.

    Qtr1, Qtr2, Qtr3 und Qtr4 werden zurückgegeben.

  5. Verwenden Sie die Funktion MemberRange, um denselben Elementbereich zu wählen, Qtr1 bis Qtr4.

    SELECT
      MemberRange([Qtr1],[Qtr4])
    ON COLUMNS
    FROM Sample.Basic
  6. Fügen Sie die Abfrage in den MaxL-Client ein, und führen Sie sie aus.

  7. Speichern Sie die Abfrage unter gry_member_range_func.txt.

Übung 6: CrossJoin-Funktion verwenden

Die CrossJoin-Funktion gibt das Kreuzprodukt von zwei Sets aus verschiedenen Essbase-Dimensionen zurück. Die Syntax lautet wie folgt:

CrossJoin(set,set)

Diese Funktion verwendet zwei Sets aus verschiedenen Dimensionen als Eingabe und erstellt ein Set, das ein Kreuzprodukt von ihnen ist. Dies ist nützlich, um symmetrische Berichte zu erstellen.

So verwenden Sie die CrossJoin-Funktion:

  1. Öffnen Sie qry_blank.txt, die Abfragevorlage, die Sie unter MDX-Abfragevorlage erstellen erstellt haben.

  2. Ersetzen Sie die geschweifte Klammer {} von der Spaltenachse durch CrossJoin().

    SELECT
      CrossJoin () 
    ON COLUMNS, 
      {}
    ON ROWS
    FROM Sample.Basic
  3. Fügen Sie zwei durch Komma getrennte Klammernpaare als Platzhalter für die beiden festgelegten Argumente hinzu, die Sie der CrossJoin-Funktion bereitstellen:

    SELECT
      CrossJoin ({}, {})
    ON COLUMNS,
      {}
    ON ROWS
    FROM Sample.Basic
  4. Geben Sie im ersten Satz das Product-Element [100-10] an. Geben Sie im zweiten Set die Market-Elemente [East], [West], [South] und [Central] an.

    SELECT
      CrossJoin ({[100-10]}, {[East],[West],[South],[Central]})
    ON COLUMNS,
      {}
    ON ROWS
    FROM Sample.Basic
  5. Verwenden Sie CrossJoin auf der Zeilenachse, um eine Gruppe von Measures-Elementen mit einem Set zu kreuzen, das Qtr1 enthält:

    SELECT
      CrossJoin ({[100-10]}, {[East],[West],[South],[Central]})
    ON COLUMNS,
      CrossJoin ( 
        {[Sales],[COGS],[Margin %],[Profit %]}, {[Qtr1]} 
      ) 
    ON ROWS
    FROM Sample.Basic
  6. Speichern Sie die Abfrage unter qry_crossjoin_func.txt.

  7. Fügen Sie die Abfrage in den MaxL-Client ein, und führen Sie sie aus.

Wenn Sie mit CrossJoin experimentieren, beachten Sie, dass die Reihenfolge der Argumente die Reihenfolge der Tupel in der Ausgabe beeinflusst.

Die Ergebnisse der Abfrage werden unten angezeigt:

Tabelle 28-4: Ergebnisse: CrossJoin-Funktion verwenden

Bild eines Bereichs wird für leere thead-Zellen verwendet Bild eines Bereichs wird für leere thead-Zellen verwendet 100-10 100-10 100-10 100-10
Bild eines Bereichs wird für leere thead-Zellen verwendet Bild eines Bereichs wird für leere thead-Zellen verwendet

Ost

West

Süd

Zentral

Vertrieb

Qrt 1

5.731

3.493

2.296

3.425

COGS

Qrt 1

1.783

1.428

1.010

1.460

Gewinnspanne in %

Qrt 1

66,803

59,118

56,01

57,372

Gewinn %

Qrt 1

45,82

29,974

32,448

24,613

Hinweis:

Verwenden Sie CrossJoinAttribute, wenn die EingabeSets eine Basisdimension und deren Attributdimension sind.

Übung 7: Verwenden der Kinderfunktion

Die Funktion "Untergeordnete Elemente" gibt eine Gruppe aller untergeordneten Elemente des angegebenen Elements zurück. Verwenden Sie diese Syntax:

Children (member)

Hinweis:

Eine alternative Syntax für untergeordnete Elemente besteht darin, sie wie folgt als Operator für das Eingabeelement zu verwenden: member.Children. In dieser Übung verwenden wir die Operatorsyntax.

So verwenden Sie die Funktion "Untergeordnete Elemente", um eine Verknüpfung in die erste Achsenspezifikation einzuführen:

  1. Öffnen Sie qry_crossjoin_func.txt, die Abfrage, die Sie in der vorherigen Übung erstellt haben.

  2. Ersetzen Sie in der zweiten Gruppe der Spaltenachsenspezifikation [East],[West],[South],[Central] durch [Market].Children.

    SELECT 
      CrossJoin ({[100-10]}, {[Market].Children})
    ON COLUMNS,
      CrossJoin (
        {[Sales],[COGS],[Margin %],[Profit %]}, {[Qtr1]}
      )
    ON ROWS
    FROM Sample.Basic
  3. Speichern Sie die Abfrage unter gry_children_func.txt.

  4. Fügen Sie die Abfrage in den MaxL-Client ein, und führen Sie sie aus.

    Sie sollten dieselben Ergebnisse sehen wie die Ergebnisse der vorherigen CrossJoin-Übung.

Referenzebenen und -generationen mit MDX

Einige MDX-Funktionen führen Mengenvorgänge basierend auf einem Eingabeschicht-Argument aus. Der Layer stellt eine Generation oder Ebene einer Essbase-Dimension dar. Erfahren Sie, wie Sie ein Set mit der Funktion "Elemente" referenzieren.

In MDX bezieht sich das Konzept einer Schicht auf Generationen und Ebenen in einer Essbase-Hierarchie.

In Essbase beginnen die Generierungsnummern mit 1 beim Dimensionsnamen; höhere Generierungsnummern sind diejenigen, die den Leaf-Elementen in einer Hierarchie am nächsten sind.

Ebenennummern beginnen am blattgrößten Teil der Hierarchie mit 0, und die höchste Ebenennummer ist ein Dimensionsname.

Sie können ein Layerargument wie folgt angeben:

  • Generierungs- oder Ebenenname. Beispiel: States oder Regions.

  • Der Dimensionsname zusammen mit dem Generierungs- oder Ebenennamen. Beispiel: Market.Regions und [Market].[States].

  • Die Ebenenfunktion mit einer Dimension und einer Ebenennummer als Eingabe. Beispiel: [Year].Levels(0).

  • Die Level-Funktion mit einem Element als Eingabe. Beispiel: [Qtr1].Level gibt die Ebene der Quartale in Sample.Basic zurück, die Ebene 1 der Market-Dimension ist.

  • Die Funktion "Generationen" mit einer Dimension und einer Generierungsnummer als Eingabe. Beispiel: [Year].Generations (3).

  • Die Generierungsfunktion mit einem Element als Eingabe. Beispiel: [Qtr1].Generation gibt die Generierung von Quartalen in Sample.Basic zurück, die Generation 2 der Market-Dimension.

Hinweis:

In der Sample.Basic-Datenbank befinden sich Qtr1 und Qtr4 in derselben Schicht. Das bedeutet, dass Qtr1 und Qtr4 ebenfalls in der gleichen Generation sind. In einer anderen Datenbank mit einer zerrütteten Hierarchie befinden sich Qtr1 und Qtr4 jedoch möglicherweise nicht unbedingt auf derselben Ebene, obwohl sie sich in derselben Generation befinden. Beispiel: Wenn die Hierarchie von Qtr1 auf Wochen herunterfährt und die Hierarchie von Qtr4 auf Monate stoppt, ist Qtr1 eine Ebene höher als Qtr4, aber sie befinden sich immer noch auf derselben Ebene.

Übung 8: Funktion "Elemente" verwenden

Mit der Funktion "Elemente" können Sie alle Elemente einer angegebenen Generation oder Ebene zurückgeben. Bei Verwendung mit einem Layerargument lautet die Syntax:

Members (layer)

wobei das Argument layer die Generation oder Ebene der zurückzugebenden Elemente angibt.

Hinweis:

Eine alternative Syntax für Elemente ist layer.Members.

So verwenden Sie die Funktion {\b Members}:

  1. Öffnen Sie qry_blank.txt, die Abfragevorlage, die Sie unter MDX-Abfragevorlage erstellen erstellt haben.

  2. Löschen Sie die geschweiften Klammern {}, die nicht erforderlich sind, wenn Sie eine Funktion verwenden, um ein Set zurückzugeben.

  3. Mit der Funktion "Elemente" und der Funktion "Ebenen" können Sie alle Elemente der Ebene 0 in der Market-Dimension von Sample.Basic auswählen:

    SELECT
      Members(Market.levels(0))
    ON COLUMNS
    FROM Sample.Basic
  4. Speichern Sie die Abfrage unter qry_members_func.txt.

  5. Fügen Sie die Abfrage in den MaxL-Client ein, und führen Sie sie aus, wie in der ersten Übung (in MDX-Sets und -Tupeln) beschrieben.

    Ergebnisse: Alle Zustände in der Market-Dimension werden zurückgegeben.

MDX-Abfrage-Point-of-View mit einer Slicer-Achse festlegen

Eine Slicer-Achse ist eine Möglichkeit, eine MDX-Abfrage so zu beschränken, dass nur ein bestimmter Bereich des Essbase-Cubes berücksichtigt wird. Lernen Sie, den Slicer in der WHERE-Klausel zu verwenden, indem Sie die Beispielübung ausprobieren.

Wenn der Slicer verwendet wird, muss er sich im WHERE-Abschnitt einer MDX-Abfrage befinden. Außerdem muss der WHERE-Abschnitt die letzte Komponente der Abfrage sein, die der Cube-Spezifikation (dem FROM-Abschnitt) folgt:

SELECT {set}
ON axes
FROM cube
WHERE slicer

Verwenden Sie die Slicer-Achse, um den Kontext der Abfrage festzulegen. Dies ist in der Regel der Standardkontext für alle anderen Achsen.

Um nur den Istumsatz im Cube "Sample.Basic" (ohne budgetierten Umsatz) auszuwählen, könnte die WHERE-Klausel wie folgt aussehen:

WHERE ([Actual], [Sales])

Da (Actual, Sales) in der Slicer-Achse angegeben ist, müssen Sie sie nicht in die ON AXIS(n)-Spezifikationen aufnehmen.

Hinweis:

Die gleiche Dimension kann nicht auf anderen Achsen und auf der Slicer-Achse angezeigt werden. Um eine Achse anhand von Kriterien aus ihrer eigenen Dimension zu filtern, können Sie eine Unterauswahl verwenden.

Übung 9: Begrenzen der Ergebnisse mit einer Slicerachse

So begrenzen Sie Ergebnisse mit der Slicer-Achse:

  1. Öffnen Sie gry_crossjoin_func.txt, die Abfrage, die Sie in Übung 6 von MDX-Funktionen zum Erstellen von Sets verwenden erstellt haben.

  2. Fügen Sie die Abfrage in den MaxL-Client ein, und führen Sie sie aus, wie in der ersten Übung (in MDX-Sets und -Tupeln) beschrieben.

    Beachten Sie die Ergebnisse in einer der Datenzellen. Beispiel: Das erste Tupel, ([Cola],[East],[Sales],[Qtr1]), hat den Wert 5731.

  3. Fügen Sie eine Slicer-Achse hinzu, um nur die Daten zu begrenzen, die auf budgetierte Werte zurückgegeben werden.

    SELECT
      CrossJoin ({[100-10]}, {[East],[West],[South],[Central]})
    ON COLUMNS,
      CrossJoin (
        {[Sales],[COGS],[Margin %],[Profit %]}, {[Qtr1]}
      )
    ON ROWS
    FROM Sample.Basic
    WHERE (Budget)
  4. Fügen Sie die Abfrage in den MaxL-Client ein, und führen Sie sie aus.

  5. Beachten Sie, dass der Wert für Tupel ([Cola],[East],[Sales],[Qtr1]) jetzt 5020 ist.

  6. Speichern Sie die Abfrage unter qry_slicer_axis.txt.

Gemeinsame MDX-Beziehungsfunktionen

MDX-Beziehungsfunktionen geben Sets oder Elemente basierend auf hierarchischen Elementbeziehungen in der Essbase-Cube-Modellstruktur zurück.

Die folgenden MDX-Beziehungsfunktionen geben Sets zurück.

Tabelle 28-5: Liste der MDX-Beziehungsfunktionen, die Sets zurückgeben

Beziehungsfunktion Beschreibung

Untergeordnete Elemente

Gibt die untergeordneten Elemente des Eingabeelements zurück.

Gleichgeordnete Elemente

Gibt die gleichgeordneten Elemente des Eingabeelements zurück.

Nachkommen

Gibt die Nachkommen eines Elements mit unterschiedlichen Optionen zurück.

Die folgenden MDX-Beziehungsfunktionen geben ein einzelnes Element statt eines Sets zurück:

Tabelle 28-6: Liste der MDX-Beziehungsfunktionen, die ein einzelnes Element zurückgeben

Beziehungsfunktion Beschreibung

Vorgänger

Gibt einen Vorgänger auf der angegebenen Ebene zurück.

Cousin(e)

Gibt ein untergeordnetes Element an derselben Position wie ein Element aus einem anderen Vorgänger zurück.

Übergeordnet

Gibt das übergeordnete Element des Eingabeelements zurück.

Erstes Kind

Gibt das erste untergeordnete Element des Eingabeelements zurück.

Zuletzt untergeordnet

Gibt das letzte untergeordnete Element des Eingabeelements zurück.

Erstes Geschwister

Gibt das erste untergeordnete Element des dem Eingabeelement übergeordneten Elements zurück.

Letzte Geschwister

Gibt das letzte untergeordnete Element des dem Eingabeelement übergeordneten Elements zurück.

Übung 10: Einige Beispiele für Beziehungsfunktionen aus der Dokumentation ausprobieren

So erfahren Sie, wie Beziehungsfunktionen funktionieren:

  1. Klicken Sie auf einen Link zu einer Funktion in einer der obigen Tabellen, oder klicken Sie auf Untergeordnete Elemente.

  2. Lesen Sie das Beispiel, und kopieren Sie die SELECT-Abfrage in die Zwischenablage.

  3. Fügen Sie die Abfrage in den MaxL-Client ein, fügen Sie ein schließendes Semikolon hinzu, und führen Sie die Abfrage aus, wie in der ersten Übung (in MDX-Sets und -Tupeln) beschrieben.

MDX-Funktionen für Set-Operationen

Mit diesen MDX-Funktionen können Sie mit Essbase Sets vergleichen, verknüpfen, kombinieren oder reduzieren: CrossJoin, CrossJoinAttribute, Distinct, Except, Generate, Head, Intersect, Subset, Tail und Union.

Lernen Sie den Unterschied zwischen Intersect- und Union-Funktionen kennen, indem Sie die Übungen ausprobieren.

Die folgenden Set-Funktionen arbeiten an Eingabe-Sets, ohne weitere Informationen aus einem Cube abzuleiten:

Tabelle 28-7: Liste der reinen Satzfunktionen

Pure Set-Funktion Beschreibung

CrossJoin, CrossJoinAttribute

Gibt eine Schnittmenge aus zwei Sets aus verschiedenen Dimensionen zurück.

Eindeutig

Löscht doppelte Tupel aus einem Set.

Außer

Gibt eine Untergruppe mit den Differenzen zwischen zwei Sets zurück.

Generieren

Eine iterative Funktion. Für jedes Tupel in set1 wird set2 zurückgegeben.

Kopf

Gibt die ersten n-Elemente oder Tupel zurück, die in einem Set vorhanden sind.

Intersect

Gibt die Schnittmenge zweier Eingabesets zurück.

Teilmenge

Gibt eine Untergruppe aus einem Set zurück, in dem die Untergruppe ein numerisch angegebener Tupelbereich ist.

Schwanz

Gibt die letzten n Elemente oder Tupel zurück, die in einem Set vorhanden sind.

Union

Gibt die Vereinigung zweier Eingabesets zurück.

Übung 11: Intersect-Funktion verwenden

Die MDX-Funktion Schnittmenge gibt die Schnittmenge zweier Eingabesätze zurück. Duplikate können optional beibehalten wird. Verwenden Sie es, um Sets zu vergleichen, indem Sie Tupel suchen, die in beiden Sets vorhanden sind.

Die folgende Syntax lautet:

Intersect (set, set [,ALL])
  1. Öffnen Sie qry_blank.txt, die Abfragevorlage, die Sie unter MDX-Abfragevorlage erstellen erstellt haben.

  2. Löschen Sie die leeren geschweiften Klammern {} von der Achse, und ersetzen Sie sie durch Intersect(). Lassen Sie etwas Platz in den geschweiften Klammern "Intersect", um weiteren Code hinzuzufügen. Beispiel:

    SELECT
       Intersect (
    
       )
    ON COLUMNS
    FROM Sample.Basic
  3. Fügen Sie zwei durch Komma getrennte Klammernpaare hinzu, die als Platzhalter für die beiden Setargumente verwendet werden, die Sie der Intersect-Funktion bereitstellen. Beispiel:

    SELECT
       Intersect ( 
       { },
       { }
       )
    ON COLUMNS
    FROM Sample.Basic
  4. Geben Sie die untergeordneten Elemente von East als erstes Setargument an. Beispiel:

    SELECT
       Intersect (
       { [East].children },
       { }
       )
    ON COLUMNS
    FROM Sample.Basic
  5. Geben Sie für das zweite Set-Argument alle Elemente der Market-Dimension an, die das UDA "Major Market" aufweisen. Beispiel:

    SELECT
       Intersect (
       { [East].children },
       { UDA([Market], "Major Market") }
       )
    ON COLUMNS
    FROM Sample.Basic
  6. Fügen Sie die Abfrage in den MaxL-Client ein, und führen Sie sie aus, wie in der ersten Übung (in MDX-Sets und -Tupeln) beschrieben.

    Alle untergeordneten Objekte im Osten mit dem UDA "Hauptmarkt" werden zurückgegeben. Beispiel:

    New York   Massachusetts   Florida
    
    8202       6172            5029
  7. Speichern Sie die Abfrage unter qry_intersect_func.txt.

Übung 12: Union-Funktion verwenden

Die MDX-Funktion Union verbindet zwei Eingabesätze, wobei optional Duplikate beibehalten werden. Verwenden Sie es, um zwei Sätze zu einem Satz zusammenzufassen.

Die folgende Syntax lautet:

Union (set, set [,ALL])
  1. Öffnen Sie qry_intersect_func.txt, die Abfrage, die Sie in der vorherigen Übung erstellt haben.

  2. Ersetzen Sie Schnittmenge durch Einheit.

  3. Speichern Sie die Abfrage unter qry_union_func.txt.

  4. Fügen Sie die Abfrage in den MaxL-Client ein, und führen Sie sie aus.

    Während Intersect ein Set zurückgab, das nur diejenigen Kinder aus Ost enthält, die ein UDA von Major Market haben, gibt Union ein größeres Set zurück. Es umfasst alle Kinder von East, UND alle Marktmitglieder, die ein UDA von Major Market haben.

     (New York)      (Massachusetts) (Florida)       (Connecticut)   (New Hampshire) (East)          (California)    (Texas)         (Central)       (Illinois)      (Ohio)          (Colorado)
    +---------------+---------------+---------------+---------------+---------------+---------------+---------------+---------------+---------------+---------------+---------------+---------------
                8202            6712            5029            3093            1125           24161           12964    6425           38262           12577            4384            7227
    

Wiederverwendbare Sets und Elemente: MDX MIT Abschnitt

Wenn Sie Elemente und Sets im WITH-Abschnitt der MDX-Abfrage definieren, können Sie Daten filtern, ohne den Cube zu beeinträchtigen. Ein berechnetes Element ist ein logisches Element, das nur in der Abfrage vorhanden ist. Ein benannter Satz ist ein logischer Satz, der nur in der Abfrage vorhanden ist. Probieren Sie eine Beispielübung aus.

Berechnete Elemente und benannte Sets sind logische Entitys in Abfragen, die während der Lebensdauer der Abfrage mehrmals verwendet werden können. Berechnete Elemente und benannte Sets können Zeit in Codezeilen sowie in der Ausführungszeit sparen. Im optionalen WITH-Abschnitt am Anfang einer MDX-Abfrage definieren Sie die berechneten Elemente und/oder benannten Sets.

Die folgende Abfrage verwendet ein berechnetes Element:

WITH
MEMBER [Measures].[Max Qtr2 Sales] AS
  'Max (
    {[Year].[Qtr2]},
    [Measures].[Sales]
  )'
SELECT
{ [Measures].[Max Qtr2 Sales] } on columns,
{ [Product].children } on rows
FROM Sample.Basic

Die folgende Abfrage verwendet eine benannte Gruppe:

WITH SET [NewSet] 
AS 'CrossJoin([Product].Children, [Market].Children)'
SELECT
   Filter([NewSet], NOT IsEmpty([NewSet].CurrentTuple)) 
ON COLUMNS
FROM Sample.Basic
WHERE
   {[Sales]}

Berechnete Elemente

Ein berechnetes Element ist ein hypothetisches Element, das für die Dauer der Abfrageausführung vorhanden ist. Berechnete Elemente ermöglichen eine komplexe Analyse, ohne dass physische Elemente zur Cube-Modellstruktur hinzugefügt werden müssen. Berechnete Elemente speichern Berechnungsergebnisse, die für physische Elemente ausgeführt werden.

Verwenden Sie die folgenden Richtlinien für berechnete Elementnamen:

  • Ordnen Sie das berechnete Element einer Dimension zu. Beispiel: Um das Element MyCalc mit der Measures-Dimension zu verknüpfen, benennen Sie es [Measures].[MyCalc].

  • Verwenden Sie keine tatsächlichen Elementnamen, um berechnete Elemente zu benennen. Beispiel: Benennen Sie kein berechnetes Element [Measures].[Sales], da Sales bereits in der Measures-Dimension vorhanden ist.

Das Festlegen der Lösungsreihenfolge für jedes berechnete Element wird empfohlen, wenn Sie mehrere berechnete Elemente zum Erstellen von Verhältnissen oder benutzerdefinierten Summen verwenden.

Benannte Sets

Sie definieren benannte Sets mit WITH SET-Schlüsselwörtern vor dem SELECT-Teil der Abfrage. Dies ist nützlich, da Sie das Set beim Erstellen des SELECT-Abschnitts der Abfrage anhand des Namens referenzieren können.

Beispiel: Die benannte Gruppe Best5Prods identifiziert eine Gruppe der fünf meistverkauften Produkte im Dezember:

WITH
SET [Best5Prods]
  AS
  'Topcount (
    [Product].members,
    5,
    ([Measures].[Sales], [Scenario].[Actual], [Year].[Dec])
  )'
SELECT [Best5Prods] ON AXIS(0),
  {[Year].[Dec]} ON AXIS(1)
FROM Sample.Basic

Übung 13: Berechnetes Element erstellen

In dieser Übung wird die Funktion Max. verwendet, eine gemeinsame MDX-Funktion für Berechnungen. Gibt das Maximum der Werte zurück, die in den Tupeln eines Sets gefunden wurden.

Die folgende Syntax lautet:

Max (set, numeric_value)
  1. Öffnen Sie qry_blank_2ax.txt, die Abfragevorlage, die Sie in Übung 3 von MDX-Abfragelayout mit Achsen und Cube-Spezifikation erstellt haben.

    SELECT
      {}
    ON COLUMNS,
      {}
    ON ROWS
    FROM Sample.Basic
  2. Geben Sie in der Zeilenachsenset die untergeordneten Elemente von {\b Product} an. Beispiel:

    SELECT
      {}
    ON COLUMNS,
      {[Product].children}
    ON ROWS
    FROM Sample.Basic
  3. Fügen Sie am Anfang der Abfrage einen Platzhalter für die berechnete Elementspezifikation hinzu. Beispiel:

    WITH MEMBER [].[]
     AS ''
    SELECT
      {}
    ON COLUMNS,
      {[Product].children}
    ON ROWS
    FROM Sample.Basic
  4. Um das berechnete Element mit der Measures-Dimension zu verknüpfen und ihr den Namen "Max. Umsatz Qtr2" zu geben, fügen Sie diese Informationen der berechneten Elementspezifikation hinzu. Beispiel:

    WITH MEMBER [Measures].[Max Qtr2 Sales]
     AS ''
    SELECT
      {}
    ON COLUMNS,
      {[Product].children}
    ON ROWS
    FROM Sample.Basic
  5. Definieren Sie nach dem AS-Schlüsselwort und innerhalb der einfachen Anführungszeichen die Logik für das berechnete Element mit dem Namen Max Qtr2 Sales.

    Verwenden Sie die Funktion "Max" mit dem Set, das (Qtr2) als erstes Argument auswertet, und die Kennzahl, die (Sales) als zweites Argument auswertet. Beispiel:

    WITH MEMBER [Measures].[Max Qtr2 Sales]
      AS '
      Max (
        {[Year].[Qtr2]},
        [Measures].[Sales]
      )'
    SELECT
      {}
    ON COLUMNS,
      {[Product].children}
    ON ROWS
    FROM Sample.Basic
    
  6. Das berechnete Element "Max. Umsatz Qtr2" wird im Abschnitt WITH definiert. Um sie in einer Abfrage zu verwenden, referenzieren Sie sie auf einer der Achsen im SELECT-Teil der Abfrage. Beispiel:

    WITH MEMBER [Measures].[Max Qtr2 Sales]
      AS '
      Max (
        {[Year].[Qtr2]},
        [Measures].[Sales]
      )'
    SELECT
      {[Measures].[Max Qtr2 Sales]}
    ON COLUMNS,
      {[Product].children}
    ON ROWS
    FROM Sample.Basic
    
  7. Speichern Sie die Abfrage unter gry_calc_member.txt.

  8. Fügen Sie die Abfrage in den MaxL-Client ein, und führen Sie sie aus, wie in der ersten Übung (in MDX-Sets und -Tupeln) beschrieben.

    Die Ergebnisse der Abfrage werden unten angezeigt:

    Tabelle 28-8: Ergebnisse: Berechnetes Element erstellen

    Bild eines Bereichs wird für leere thead-Zellen verwendet Max. Umsatz Quartal 2

    100

    27.187

    200

    27.401

    300

    25.736

    400

    21.355

    Diät

    26.787

Hinweis:

Viele weitere Beispiele finden Sie in der MDX-Referenzdokumentation. Siehe MDX mit Abschnitt.

Iterative MDX-Funktionen

Iterative MDX-Funktionen durchlaufen Datensets im Essbase-Cube und führen Suchbedingungen aus, die Sie angeben, um die Ergebnisse anzupassen. Beispiel zum Filtern von Daten basierend auf einem booleschen Test.

Tabelle 28-9: Liste der Iterativen MDX-Funktionen

Funktion Beschreibung

Filter

Gibt die Teilmenge der Tupel in set zurück, für die der Wert der Suchbedingung TRUE ist.

IIF

Führt einen Bedingtest aus und gibt einen entsprechenden numerischen Ausdruck oder ein entsprechendes numerisches Set zurück, je nachdem, ob der Test als TRUE oder FALSE ausgewertet wird.

Fall

Führt bedingte Tests aus und gibt die von Ihnen angegebenen Ergebnisse zurück.

Generieren

Für jedes Tupel in set1 wird set2 zurückgegeben.

Beispiel für eine Filterfunktion

Die folgende Abfrage verwendet die MDX-Filterfunktion, um alle Market-Dimensionselemente zurückzugeben, für die der Ausdruck IsChild([Market].CurrentMember,[East]) TRUE zurückgibt. Die Abfrage gibt alle untergeordneten Elemente von East zurück.

SELECT
  Filter([Market].Members,
    IsChild([Market].CurrentMember,[East])
  )
ON COLUMNS
FROM Sample.Basic

Die Filterfunktion in MDX ist mit dem Befehl RESTRICT in Report Writer vergleichbar.

Fehlende Daten mit MDX verarbeiten

Wenn Sie einen Essbase-Cube mit MDX abfragen, können Sie die Schlüsselwörter NON EMPTY auf den Achsen verwenden, um Zellen zu unterdrücken, die keinen Wert enthalten. MDX-Funktionen, die fehlende Werte verarbeiten, umfassen "Durchschn", "CoalesceEmpty", "IsEmpty", "NonEmptyCount" und "NonEmptySubset". Mit den Eigenschaften NONEMPTYMEMBER und NONEMPTYTUPLE können Sie leere Werte aus großen Datasets herausfiltern.

Wenn Sie die optionalen Schlüsselwörter NON EMPTY vor der Set-Spezifikation in eine Achse einfügen, werden Bereiche in dieser Achse unterdrückt, die vollständig #MISSING-Werte enthalten würden.

Die Achsenspezifikationssyntax mit NON EMPTY lautet wie folgt:

<axis_specification> ::=
  [NON EMPTY] <set> ON
  COLUMNS | ROWS | PAGES | CHAPTERS |
  SECTIONS | AXIS (<unsigned_integer>)

Für ein bestimmtes Tupel auf einer Achse (z.B. (Qtr1, Actual)) besteht ein Abschnitt aus den Zellen, die sich aus der Kombination dieses Tupels mit allen Tupeln aller anderen Achsen ergeben. Wenn alle diese Zellenwerte #MISSING sind, bewirkt das Schlüsselwort NON EMPTY die Eliminierung des Tupels.

Beispiel: Wenn selbst ein Wert in einer Zeile nicht leer ist, wird die gesamte Zeile zurückgegeben. Wenn Sie NON EMPTY am Anfang der Zeilenachsenspezifikation einfügen, wird das folgende Zeilensegment aus dem von einer Abfrage zurückgegebenen Set entfernt:

Eine Zeile mit #MISSING-Werten für Qtr1, Actual

Neben der Unterdrückung fehlender Werte mit NON EMPTY können Sie die folgenden MDX-Funktionen verwenden, um #MISSING-Ergebnisse zu verarbeiten:

  • CoalesceEmpty, das numerische Wertausdrücke für Nicht-#MISSING-Werte durchsucht

  • IsEmpty, das TRUE zurückgibt, wenn der Wert eines eingegebenen numerischen Wertausdruckes #MISSING ist

  • Durchschnittlich, wodurch fehlende Werte aus den Durchschnittswerten ausgelassen werden, es sei denn, Sie verwenden das optionale Kennzeichen "IncludeEmpty".

Die MDX-Funktion NonEmptyCount gibt die Anzahl der Tupel in einem Set aus, die als Nicht-#Missing-Werte ausgewertet werden. Jedes Tupel wird ausgewertet und in die von dieser Funktion zurückgegebene Anzahl aufgenommen. Wenn der numerische Wertausdruck angegeben wird, wird er im Kontext jedes Tupels ausgewertet, und die Anzahl der Nicht-#Fehlenden Werte wird zurückgegeben.

Nur bei Aggregate Storage-Cubes ist die Funktion NonEmptyCount so optimiert, dass die Berechnung der eindeutigen Anzahl für alle Zellen durch Scannen des Cubes nur einmal ausgeführt werden kann. Ohne diese Optimierung wird die Datenbank so oft gescannt wie die Anzahl der Zellen, die der eindeutigen Anzahl entsprechen. Die NonEmptyCount-Optimierung wird ausgelöst, wenn eine Outline-Elementformel die folgende Syntax aufweist:

NONEMPTYCOUNT(set, measure, exclude_missing)

Der Parameter exclude_missing unterstützt die NonEmptyCount-Optimierung für Aggregatdatenbanken, indem die Performance einer Abfrage verbessert wird, die Metriken abfragt, die eine eindeutige Zählberechnung ausführen.

Mit den Optimierungseigenschaften NONEMPTYMEMBER und NONEMPTYTUPLE kann MDX große Gruppen von Elementen oder Tupeln abfragen, während die Formelausführung für nicht beitragende Werte übersprungen wird, die nur #MISSING-Daten enthalten.

  • Verwenden Sie eine einzelne NONEMPTYMEMBER-Eigenschaftsklausel am Anfang eines berechneten Elements oder Formelausdrucks, um Essbase anzugeben, dass der Wert der Formel oder des berechneten Elements leer ist, wenn eines der in nonempty_member_list angegebenen Elemente leer ist.

  • Verwenden Sie eine einzelne NONEMPTYTUPLE-Eigenschaftsklausel am Anfang eines berechneten Elements oder Formelausdrucks, um Essbase anzugeben, dass der Wert der Formel oder des berechneten Elements leer ist, wenn der Zellenwert am in nonempty_member_list angegebenen Tupel leer ist.

Bei einem Eingabeset gibt die MDX-Funktion NonEmptySubset eine Teilmenge dieses Eingabesets zurück, in dem alle Tupel als nicht leer ausgewertet werden. Für die Prüfung, die nicht leer ist, kann ein optionaler Wertausdruck angegeben werden. Diese Funktion kann helfen, Abfragen zu optimieren, die auf einem großen Set basieren, für das der Satz nicht leerer Kombinationen als klein bekannt ist. NonEmptySubset reduziert die Größe des Sets, wenn eine Metrik vorhanden ist. Beispiel: Sie können die nicht leere Untergruppe von Nachkommen für bestimmte Einheiten anfordern.

Variablen in MDX-Abfragen

Sie können vordefinierte Essbase-Substitutionsvariablen in MDX verwenden, um häufig wechselnde Informationen zu referenzieren, ohne Ihre Abfragen zu ändern. Um eine Variable in einer MDX-Abfrage oder einem MDX-Ausdruck zu referenzieren, geben Sie den Variablennamen vor einem Et-Zeichen (&) ein.

Substitutionsvariablen in Essbase fungieren als Platzhalter für Informationen, die sich regelmäßig ändern. Sie legen die Substitutionsvariablen auf der Essbase-Cube-, Anwendungs- oder globalen Ebene fest und weisen jeder Variablen einen Wert zu. Sie können den Wert jederzeit ändern. Sie müssen mindestens über die Rolle von Database Manager verfügen, um Substitutionsvariablen festzulegen. Informationen hierzu finden Sie unter Variablen zum Ändern von Informationen implementieren.

So verwenden Sie eine Substitutionsvariable in einem MDX-Ausdruck:

  • Auf die Substitutionsvariable muss über die Anwendung und den Cube zugegriffen werden können, die Sie abfragen.

  • Eine Substitutionsvariable hat zwei Komponenten: den Namen und den Wert.

  • Der Variablenname kann eine alphanumerische Kombination sein, deren maximale Größe unter Limits für Namen und zugehörige Artefakte angegeben ist. Verwenden Sie keine Leerzeichen, Satzzeichen oder Klammern ([ ]) in Substitutionsvariablennamen, die in MDX verwendet werden.

  • Geben Sie an der Stelle im Ausdruck, an der Sie die Variable verwenden möchten, den Variablennamen ein, dem ein Et-Zeichen (&) vorangestellt ist. Beispiel: Wenn CurMonth der Name der auf dem Server festgelegten Substitutionsvariablen ist, nehmen Sie &CurMonth in den MDX-Ausdruck auf.

  • Wenn Sie den Abruf ausführen, ersetzt Essbase den Variablennamen durch den Ersetzungswert. Dieser Wert wird vom MDX-Ausdruck verwendet.

Beispiel: Der Ausdruck wird geschrieben und zeigt den Variablennamen CurQtr vor dem &: an.

SELECT 
  {[&CurQtr]}
ON COLUMNS
FROM Sample.Basic

Wenn der Ausdruck ausgewertet wird, wird der aktuelle Wert (Qtr1) durch den Variablennamen ersetzt, sodass der ausgeführte Ausdruck effektiv ist:

SELECT 
  {[Qtr1]}
ON COLUMNS
FROM Sample.Basic

Abfragen von Eigenschaften in MDX

Eigenschaften beschreiben bestimmte Eigenschaften von Essbase-Daten und -Metadaten. Mit MDX können Sie Abfragen schreiben, die Daten basierend auf Essbase-Eigenschaften abrufen und analysieren, die intrinsisch oder benutzerdefiniert sein können. Sie können Eigenschaften auf den MDX-Abfrageachsen oder in einem Wertausdruck aufrufen.

Eigene und benutzerdefinierte Eigenschaften

In MDX beschreibt properties bestimmte Eigenschaften von Daten und Metadaten. Mit MDX können Sie Abfragen schreiben, die Eigenschaften zum Abrufen und Analysieren von Daten verwenden. Eigenschaften können intrinsisch oder benutzerdefiniert sein.

Eigene Eigenschaften

Eigene Eigenschaften sind für Elemente in allen Dimensionen definiert. Die inhärenten Elementeigenschaften, die für alle Elemente in einer Essbase-Datenbankmodellstruktur definiert sind, sind MEMBER_NAME, MEMBER_ALIAS, LEVEL_NUMBER, GEN_NUMBER, IS_EXPENSE, COMMENTS und MEMBER_UNIQUE_NAME.

Eine Beschreibung dieser Eigenschaften finden Sie unter MDX Intrinsic Properties.

Benutzerdefinierte Eigenschaften

MDX in Essbase unterstützt zwei Typen von benutzerdefinierten Eigenschaften: Attributeigenschaften und UDA-Eigenschaften. Attributeigenschaften werden durch die Attributdimensionen in einer Gliederung definiert. In der Sample.Basic-Datenbank beschreibt die Pkg Type-Attributdimension die Packaging-Eigenschaften von Elementen in der Product-Dimension. Diese Informationen können in MDX mit dem Eigenschaftsnamen [Pkg Type] abgefragt werden.

Attributeigenschaften werden nur für bestimmte Dimensionen und nur für eine bestimmte Ebene in jeder Dimension definiert. Beispiel: In der Modellstruktur {\b Sample.Basic} ist [Ounces] eine Attributeigenschaft, die nur für Elemente in der Dimension {\b Product} definiert ist. Diese Eigenschaft enthält nur gültige Werte für die Elemente der Ebene 0 der Dimension {\b Product}. Die Eigenschaft [Ounces] ist für andere Dimensionen, wie z.B. Market, nicht vorhanden. Die Eigenschaft [Ounces] für ein Element der Ebene 0 in der Product-Dimension ist ein NULL-Wert. Die Attributeigenschaften in einer Outline werden durch die Namen der Attribute-Dimensionen in dieser Outline identifiziert.

Die benutzerdefinierten Eigenschaften umfassen auch UDAs. Beispiel: [Major Market] ist eine UDA-Eigenschaft, die für Market-Dimensionselemente definiert ist. Es gibt einen TRUE-Wert zurück, wenn das UDA [Major Market] für ein Mitglied definiert ist, andernfalls FALSE.

Siehe auch Benutzerdefinierte MDX-Eigenschaften.

Eigenschaften in einer Abfrageachse aufrufen

Sie können die Dimensions- und Eigenschaftskombinationen für jede Achsengruppe auflisten. Wenn eine Abfrage ausgeführt wird, wird die angegebene Eigenschaft für alle Elemente aus der angegebenen Dimension ausgewertet und in die Ergebnismenge aufgenommen.

Beispiel: Auf der Spaltenachse gibt die folgende Abfrage die GEN_NUMBER-Informationen für jedes Market-Dimensionselement zurück. Auf der Zeilenachse gibt die Abfrage MEMBER_ALIAS-Informationen für jedes Product-Dimensionselement zurück.

SELECT
  [Market].Members
    DIMENSION PROPERTIES [Market].[GEN_NUMBER] on columns,
  Filter ([Product].Members, Sales > 5000)
    DIMENSION PROPERTIES [Product].[MEMBER_ALIAS] on rows
FROM Sample.Basic

Wenn Sie Elementeigenschaften mit dem Abschnitt DIMENSION PROPERTIES einer Achse abfragen, kann eine Eigenschaft durch den Dimensionsnamen und den Namen der Eigenschaft oder durch den Eigenschaftsnamen selbst identifiziert werden. Wenn ein Eigenschaftsname von selbst verwendet wird, werden diese Eigenschaftsinformationen für alle Elemente aus allen Dimensionen auf dieser Achse zurückgegeben, für die diese Eigenschaft gilt.

In der folgenden Abfrage wird die Eigenschaft MEMBER_ALIAS auf der Zeilenachse für Year- und Product-Dimensionen ausgewertet.

SELECT [Market].Members
  DIMENSION PROPERTIES [Market].[GEN_NUMBER] on columns,
  CrossJoin([Product].Children, Year.Children)
    DIMENSION PROPERTIES [MEMBER_ALIAS] on rows
FROM Sample.Basic

Eigenschaften in einem Wertausdruck aufrufen

Eigenschaften können innerhalb von Wertausdrücken in einer MDX-Abfrage verwendet werden. Beispiel: Sie können ein Set basierend auf einem Wertausdruck filtern, der Eigenschaften von Elementen im Eingabeset verwendet.

Die folgende Abfrage gibt alle koffeinhaltigen Produkte zurück, die in Dosen verpackt sind.

SELECT
   Filter([Product].levels(0).members,
    [Product].CurrentMember.Caffeinated and
    [Product].CurrentMember.[Pkg Type] = "Can")
       Dimension Properties
       [Caffeinated], [Pkg Type] on columns
FROM Sample.Basic

Die folgende Abfrage berechnet den Wert [BudgetedExpenses] basierend darauf, ob der aktuelle Markt ein wichtiger Markt ist, mit dem UDA [Major Market].

WITH
  MEMBER [Measures].[BudgetedExpenses] AS
    'IIF([Market].CurrentMember.[Major Market],
    [Marketing] * 1.2, [Marketing])'

SELECT  {[Measures].[BudgetedExpenses]} ON COLUMNS,
  [Market].Members ON ROWS
FROM Sample.Basic
WHERE ([Budget])

Wertetyp der Eigenschaften

Der Wert einer MDX-Eigenschaft in Essbase kann ein numerischer, boolescher oder Stringtyp sein. Die Eigenschaften MEMBER_NAME und MEMBER_ALIAS geben Zeichenfolgenwerte zurück. Die Eigenschaften LEVEL_NUMBER und GEN_NUMBER geben numerische Werte zurück.

Die Attributeigenschaften geben numerische, boolesche oder Zeichenfolgenwerte basierend auf dem Attributdimensionstyp zurück. Beispiel: In Sample.Basic ist die Eigenschaft [Ounces] eine numerische Eigenschaft. Die Eigenschaft [Pkg Type] ist eine Zeichenfolgeneigenschaft. Die Eigenschaft [Caffeinated] ist eine boolesche Eigenschaft.

In Essbase sind Attributdimensionen mit Datumstypen zulässig. Die Datentypeigenschaften werden in MDX als numerische Eigenschaften behandelt. Wenn Sie diese Eigenschaftswerte mit Datumswerten vergleichen, verwenden Sie die Funktion Todate, um Datumszeichenfolgen vor dem Vergleich in numerische Zeichenfolgen zu konvertieren.

Die folgende Abfrage gibt alle Product-Dimensionselemente zurück, die am 25.03.2018 eingeführt wurden. Da die Eigenschaft [Intro Date] ein Datumstyp ist, muss die Funktion TODATE verwendet werden, um die Datumszeichenfolge "03-25-2018" in eine Zahl zu konvertieren, bevor sie verglichen wird.

SELECT
  Filter ([Product].Members,
    [Product].CurrentMember.[Intro Date] = 
    TODATE("mm-dd-yyyy","03-25-2018"))ON COLUMNS
FROM Sample.Basic

Wenn eine Eigenschaft in einem Wertausdruck verwendet wird, müssen Sie sie entsprechend ihrem Werttyp verwenden: Zeichenfolge, numerisch oder boolesch.

Sie können auch Attributdimensionen mit numerischen Bereichen abfragen.

Die folgende Abfrage ruft Umsatzdaten für kleine, mittlere und große Populationsbereiche ab.

SELECT
  {Sales} ON COLUMNS,
  {Small, Medium, Large} ON ROWS
FROM Sample.Basic

Wenn Attribute als Eigenschaften IN einem Wertausdruck verwendet werden, können Sie mit dem Operator IN prüfen, ob der Eigenschaftswert eines Elements IN einen bestimmten Bereich fällt.

Beispiel: Die folgende Abfrage gibt alle Market-Dimensionselemente mit dem Auffüllungsbereich "Mittel" zurück:

SELECT
  Filter(
    Market.Members, Market.CurrentMember.Population
    IN "Medium"
  )
ON AXIS(0)
FROM Sample.Basic

NULL-Eigenschaftenwerte

Nicht alle Elemente können gültige Werte für einen angegebenen Eigenschaftsnamen aufweisen. Beispiel: Die Eigenschaft MEMBER_ALIAS gibt einen alternativen Namen für ein bestimmtes Element zurück, wie in der Outline definiert. Es können jedoch nicht für alle Elemente Aliasnamen definiert sein. In diesen Fällen wird ein NULL-Wert für Elemente zurückgegeben, die keine Aliasnamen haben.

In der folgenden Abfrage

SELECT
  [Year].Members
   DIMENSION PROPERTIES [MEMBER_ALIAS]
ON COLUMNS
FROM Sample.Basic

Für keines der Elemente in der Year-Dimension sind Aliasnamen definiert. Daher gibt die Abfrage NULL-Werte für die Eigenschaft MEMBER_ALIAS für Elemente in der Year-Dimension zurück.

Die Attributeigenschaften werden für Elemente einer bestimmten Dimension und einer bestimmten Ebene in dieser Dimension definiert. In der Sample.Basic-Datenbank wird die Eigenschaft [Ounces] nur für Elemente der Ebene 0 der Product-Dimension definiert.

Wenn Sie also die Eigenschaft [Ounces] eines Elements aus der Market-Dimension abfragen, wie in der folgenden Abfrage gezeigt, erhalten Sie einen Syntaxfehler:

SELECT
  Filter([Market].members,
    [Market].CurrentMember.[Ounces] = 32) ON COLUMNS
FROM Sample.Basic

Wenn Sie außerdem die Eigenschaft [Ounces] eines Elements der Dimension ohne Ebene 0 abfragen, erhalten Sie einen NULL-Wert.

Wenn Sie Eigenschaftswerte in Wertausdrücken verwenden, können Sie mit der Funktion IsValid() auf NULL-Werte prüfen. Die folgende Abfrage gibt alle Product-Dimensionselemente mit dem Eigenschaftswert [Ounces] von 12 zurück, nachdem Elemente mit NULL-Werten entfernt wurden.

SELECT
  Filter([Product].Members,
    IsValid([Product].CurrentMember.[Ounces]) AND
    [Product].CurrentMember.[Ounces] = 12) 
ON COLUMNS
FROM Sample.Basic