MDX-Datenmanipulation – SELECT

Ruft Daten von einem bestimmten Würfel ab.

Syntax

  
[ WITH <SELECT WITH clause>   
   [ , <SELECT WITH clause>...n ]   
]   
SELECT   
     [ *   
    | ( <SELECT query axis clause>   
                  [ , <SELECT query axis clause>,...n ]   
            )   
            ]  
FROM   
   <SELECT subcube clause>   
      [ <SELECT slicer axis clause> ]  
      [ <SELECT cell property list clause> ]  
  
<SELECT WITH clause> ::=  
     ( CELL CALCULATION <CREATE CELL CALCULATION body clause> )   
   | ( [ CALCULATED ] MEMBER <CREATE MEMBER body clause>)   
   | ( SET <CREATE SET body clause>)  
   | ( MEASURE = <measure body clause> )  
  
<SELECT query axis clause> ::=  
   [ NON EMPTY ] Set_Expression  
   [ <SELECT dimension property list clause> ]   
      ON   
            Integer_Expression   
       | AXIS(Integer)   
       | COLUMNS   
       | ROWS   
       | PAGES   
       | SECTIONS   
       | CHAPTERS   
  
<SELECT subcube clause> ::=  
      Cube_Name   
   | [NON VISUAL] (SELECT   
                  [ *   
       | ( <SELECT query axis clause> [ ,   
           <SELECT query axis clause>,...n ] )   
         ]   
            FROM   
         <SELECT subcube clause>   
         <SELECT slicer axis clause> )  
  
<SELECT slicer axis clause> ::=   
      WHERE Tuple_Expression  
  
<SELECT cell property list clause> ::=   
   [ CELL ] PROPERTIES CellProperty_Name   
      [ , CellProperty_Name,...n ]  
  
<SELECT dimension property list clause> ::=  
   [DIMENSION] PROPERTIES   
      (DimensionProperty_Name   
         [,DimensionProperty_Name,...n ] )   
    | (LevelProperty_Name   
         [, LevelProperty_Name,...n ] )   
    | (MemberProperty_Name   
         [, MemberProperty_Name,...n ] )  

Argumente

Set_Expression
Ein gültiger Multidimensional Expressions (MDX)-Ausdruck, der eine Menge zurückgibt.

Integer
Eine ganze Zahl zwischen 0 und 127.

Cube_Name
Eine gültige Zeichenkette, die einen Würfelnamen liefert.

Tuple_Expression
Ein gültiger Multidimensional Expressions (MDX)-Ausdruck, der ein Tupel zurückgibt.

CellProperty_Name
Eine gültige Zeichenkette, die eine Zelleigenschaft darstellt.

DimensionProperty_Name
Eine gültige Zeichenkette, die eine Dimensionseigenschaft darstellt.

LevelProperty_Name
Eine gültige Zeichenkette, die eine Ebeneneigenschaft darstellt.

MemberProperty_Name
Eine gültige Zeichenkette, die eine Mitgliedereigenschaft darstellt.

Bemerkungen

Der Ausdruck <SELECT slicer axis clause> muss Mitglieder in Dimensionen und Hierarchien enthalten, die nicht in den angegebenen <SELECT query axis clause> Ausdrücken referenziert sind.

Wenn ein Attribut im Würfel aus den angegebenen <SELECT query axis clause> Ausdrücken und dem Wert <SELECT slicer axis clause> weggelassen wird, wird das Standardmitglied des Attributs implizit zur Slicer-Achse hinzugefügt.

Die NON VISUAL-Option in der Subselect-Anweisung ermöglicht es Ihnen, Mitglieder herauszufiltern und dabei die wahren Totalen statt gefilterter Totalen beizubehalten. Dadurch können Sie nach den zehn größten Verkäufen (Personen/Produkten/Regionen) fragen und die tatsächliche Gesamtsumme der Verkäufe für alle angeforderten Mitglieder erhalten, anstatt des Gesamtumsatzes der zehn meist zurückgegebenen Verkäufe. Weitere Informationen finden Sie in den folgenden Beispielen.

Berechnete Mitglieder können in <die SELECT-Abfrageachsenklausel> aufgenommen werden, wann immer die Verbindung mit dem Verbindungszeichenfolge-Parameter subqueries=1 geöffnet wurde; siehe Unterstützte XMLA-Eigenschaften (XMLA) und ConnectionString zur Parameternutzung. Ein Beispiel ist für berechnete Mitglieder in Subselects angegeben.

Autoexistenz

Wenn zwei oder mehr Attribute der Dimension in einer SELECT-Anweisung verwendet werden, bewertet Analysis Services die Ausdrücke der Attribute, um sicherzustellen, dass die Mitglieder dieser Attribute korrekt begrenzt sind, um die Kriterien aller anderen Attribute zu erfüllen. Angenommen, Sie arbeiten mit Attributen aus der Dimension "Geography". Wenn du einen Ausdruck hast, der alle Mitglieder aus dem City-Attribut zurückgibt, und einen anderen, der Mitglieder des Country-Attributs auf alle Länder/Regionen Europas beschränkt, dann sind die City-Mitglieder nur auf Städte beschränkt, die zu Ländern/Regionen in Europa gehören. Diese Eigenschaft von Analysis Services heißt Autoexistenz und gilt nur für Attribute in derselben Dimension. AutoExists gilt nur für Attribute derselben Dimension, da es versucht zu verhindern, dass die in einem Attributausdruck ausgeschlossenen Dimensionsdatensätze in die anderen Attributausdrücke aufgenommen werden. Autoexistenz kann auch als das resultierende Durchschneiden der verschiedenen Attributausdrücke über den Dimensionsdatensätzen verstanden werden. Siehe die folgenden Beispiele unten:

//Obtain the Top 10 best reseller selling products by Name  
with member [Measures].[PCT Discount] AS '[Measures].[Discount Amount]/[Measures].[Reseller Sales Amount]', FORMAT_STRING = 'Percent'  
set Top10SellingProducts as 'topcount([Product].[Model Name].children, 10, [Measures].[Reseller Sales Amount])'  
set Preferred10Products as '  
{[Product].[Model Name].&[Mountain-200],  
[Product].[Model Name].&[Road-250],  
[Product].[Model Name].&[Mountain-100],  
[Product].[Model Name].&[Road-650],  
[Product].[Model Name].&[Touring-1000],  
[Product].[Model Name].&[Road-550-W],  
[Product].[Model Name].&[Road-350-W],  
[Product].[Model Name].&[HL Mountain Frame],  
[Product].[Model Name].&[Road-150],  
[Product].[Model Name].&[Touring-3000]  
}'  
select {[Measures].[Reseller Sales Amount], [Measures].[Discount Amount], [Measures].[PCT Discount]} on 0,  
Top10SellingProducts on 1  
from [Adventure Works]  

Die erhaltene Ergebnismenge lautet:

Modellname + Maße Umsatzbetrag des Wiederverkäufers Rabattbetrag PCT Rabatt
Berg-200 $14,356,699,36 $19.012.71 0.13%
Road-250 $9.377.457,68 $4.032,47 0.04%
Berg-100 $8,568,958,27 $139,393.27 1.63%
Road-650 $7,442,141,81 $39.698.30 0,53%
Touring-1000 $6.723.794.29 $166.144.17 2.47%
Road-550-W $3,668,383,88 $1.901,97 0.05%
Road-350-W $3,665,932,31 $20,946,50 0,57%
HL Mountain Frame $3,365,069,27 $174.11 0.01%
Road-150 $2,363,805.16 $0,00 0.00%
Touring-3000 $ 2.046.508.26 $79,582,15 3.89%

Die gewonnene Produktmenge scheint mit Preferred10Products identisch zu sein; überprüfen Sie daher den Satz "Preferred10Products":

with member [Measures].[PCT Discount] AS '[Measures].[Discount Amount]/[Measures].[Reseller Sales Amount]', FORMAT_STRING = 'Percent'  
set Top10SellingProducts as 'topcount([Product].[Model Name].children, 10, [Measures].[Reseller Sales Amount])'  
set Preferred10Products as '  
{[Product].[Model Name].&[Mountain-200],  
[Product].[Model Name].&[Road-250],  
[Product].[Model Name].&[Mountain-100],  
[Product].[Model Name].&[Road-650],  
[Product].[Model Name].&[Touring-1000],  
[Product].[Model Name].&[Road-550-W],  
[Product].[Model Name].&[Road-350-W],  
[Product].[Model Name].&[HL Mountain Frame],  
[Product].[Model Name].&[Road-150],  
[Product].[Model Name].&[Touring-3000]  
}'  
select {[Measures].[Reseller Sales Amount], [Measures].[Discount Amount], [Measures].[PCT Discount]} on 0,  
Preferred10Products on 1  
from [Adventure Works]  

Gemäß den folgenden Ergebnissen sind beide Sätze (Top10SellingProducts, Preferred10Products) identisch.

Modellname + Maße Umsatzbetrag des Wiederverkäufers Rabattbetrag PCT Rabatt
Berg-200 $14,356,699,36 $19.012.71 0.13%
Road-250 $9.377.457,68 $4.032,47 0.04%
Berg-100 $8,568,958,27 $139,393.27 1.63%
Road-650 $7,442,141,81 $39.698.30 0,53%
Touring-1000 $6.723.794.29 $166.144.17 2.47%
Road-550-W $3,668,383,88 $1.901,97 0.05%
Road-350-W $3,665,932,31 $20,946,50 0,57%
HL Mountain Frame $3,365,069,27 $174.11 0.01%
Road-150 $2,363,805.16 $0,00 0.00%
Touring-3000 $ 2.046.508.26 $79,582,15 3.89%

In den vorherigen Beispielen haben wir zwei Mengen erstellt: eine als berechneter Ausdruck und die andere als konstante Expression. Diese Beispiele veranschaulichen die verschiedenen Varianten von Autoexists.

Autoexistenz kann tief oder flach auf die Ausdrücke angewendet werden. Die Standardeinstellung ist tief. Im folgenden Beispiel wird das Konzept von Deep Autoexists veranschaulicht. Im Beispiel filtern wir Top10SellingProducts nach dem Attribut [Product].[Product Line] für diejenigen in der [Mountain]-Gruppe. Beachten Sie, dass beide Attribute (Slicer und Achse) zur gleichen Dimension gehören, [Produkt].

with member [Measures].[PCT Discount] AS '[Measures].[Discount Amount]/[Measures].[Reseller Sales Amount]', FORMAT_STRING = 'Percent'  
set Top10SellingProducts as 'topcount([Product].[Model Name].children, 10, [Measures].[Reseller Sales Amount])'  
// Preferred10Products set removed for clarity  
select {[Measures].[Reseller Sales Amount], [Measures].[Discount Amount], [Measures].[PCT Discount]} on 0,  
Top10SellingProducts on 1  
from [Adventure Works]  
where [Product].[Product Line].[Mountain]  

Erzeugt folgende Ergebnismenge:

Modellname + Maße Umsatzbetrag des Wiederverkäufers Rabattbetrag PCT Rabatt
Berg-200 $14,356,699,36 $19.012.71 0.13%
Berg-100 $8,568,958,27 $139,393.27 1.63%
HL Mountain Frame $3,365,069,27 $174.11 0.01%
Berg-300 $1.907.249.38 $876,95 0.05%
Mountain-500 $1.067.327,31 $17.266.09 1.62%
Mountain-400-W $592,450,05 $303,49 0.05%
LL Mountain Frame $521,864,42 $252,41 0.05%
ML Mountain Frame-W $482.953.16 $206,95 0.04%
ML Mountain Frame $343.785.29 $161,82 0.05%
Damen Mountain Shorts $260,304.09 $6.675,56 2.56%

Im vorherigen Ergebnisset haben wir sieben Neuzugänge auf der Liste der Top10SellingProducts und Mountain-200, Mountain-100 und HL Mountain Frame sind an die Spitze der Liste gerückt. Im vorherigen Ergebnisset wurden diese drei Werte zwischendurch eingestreut

Dies wird als Deep Autoexists bezeichnet, da der Satz "Top10SellingProducts" ausgewertet wird, um die Schneidebedingungen der Abfrage zu erfüllen. Tiefe Autoexistenz bedeutet, dass alle Ausdrücke ausgewertet werden, um die tiefstmögliche Ebene nach Anwendung der Slicer-Ausdrücke, der Sub-Select-Ausdrücke auf der Achse usw. zu erreichen.

Allerdings kann man die Analyse über die Top10SellingProducts als Äquivalent zu Preferred10Products durchführen, wie im folgenden Beispiel gezeigt wird:

with member [Measures].[PCT Discount] AS '[Measures].[Discount Amount]/[Measures].[Reseller Sales Amount]', FORMAT_STRING = 'Percent'  
set Top10SellingProducts as 'topcount([Product].[Model Name].children, 10, [Measures].[Reseller Sales Amount])'  
set Preferred10Products as '  
{[Product].[Model Name].&[Mountain-200],  
[Product].[Model Name].&[Road-250],  
[Product].[Model Name].&[Mountain-100],  
[Product].[Model Name].&[Road-650],  
[Product].[Model Name].&[Touring-1000],  
[Product].[Model Name].&[Road-550-W],  
[Product].[Model Name].&[Road-350-W],  
[Product].[Model Name].&[HL Mountain Frame],  
[Product].[Model Name].&[Road-150],  
[Product].[Model Name].&[Touring-3000]  
}'  
select {[Measures].[Reseller Sales Amount], [Measures].[Discount Amount], [Measures].[PCT Discount]} on 0,  
Preferred10Products on 1  
from [Adventure Works]  
where [Product].[Product Line].[Mountain]  

Erzeugt folgende Ergebnismenge:

Modellname + Maße Umsatzbetrag des Wiederverkäufers Rabattbetrag PCT Rabatt
Berg-200 $14,356,699,36 $19.012.71 0.13%
Berg-100 $8,568,958,27 $139,393.27 1.63%
HL Mountain Frame $3,365,069,27 $174.11 0.01%

In den obigen Ergebnissen ergibt das Slicing ein Ergebnis, das nur die Produkte aus Preferred10Products enthält, die Teil der [Mountain]-Gruppe in [Produkt].[Produktlinie] sind, wie erwartet, da Preferred10Products ein konstanter Ausdruck ist.

Diese Ergebnismenge wird auch als flache Autoexisten verstanden. Dies liegt daran, dass der Ausdruck vor der Slicing-Klausel ausgewertet wird. Im vorherigen Beispiel war der Ausdruck ein konstanter Ausdruck für Illustrationszwecke, um das Konzept einzuführen.

Das Verhalten von Autoexists kann auf Sitzungsebene mithilfe der Autoexists-Eigenschaft der Verbindungszeichenfolge geändert werden. Das folgende Beispiel beginnt mit dem Öffnen einer neuen Sitzung und dem Hinzufügen der Autoexists=3-Eigenschaft zur Verbindungszeichenfolge. Sie müssen eine neue Verbindung öffnen, um das Beispiel ausführen zu können. Sobald die Verbindung mit der Einstellung "Autoexist" hergestellt wurde, bleibt sie wirksam, bis diese Verbindung abgeschlossen ist.

with member [Measures].[PCT Discount] AS '[Measures].[Discount Amount]/[Measures].[Reseller Sales Amount]', FORMAT_STRING = 'Percent'  
set Top10SellingProducts as 'topcount([Product].[Model Name].children, 10, [Measures].[Reseller Sales Amount])'  
//Preferred10Products set removed for clarity  
select {[Measures].[Reseller Sales Amount], [Measures].[Discount Amount], [Measures].[PCT Discount]} on 0,  
Top10SellingProducts on 1  
from [Adventure Works]  
where [Product].[Product Line].[Mountain]  

Die folgende Ergebnismenge zeigt nun das oberflächliche Verhalten von Autoexists.

Modellname + Maße Umsatzbetrag des Wiederverkäufers Rabattbetrag PCT Rabatt
Berg-200 $14,356,699,36 $19.012.71 0.13%
Berg-100 $8,568,958,27 $139,393.27 1.63%
HL Mountain Frame $3,365,069,27 $174.11 0.01%

Das Verhalten der Autoexistenz kann mithilfe des Parameters AUTOEXISTS=[1|2|3] in der Verbindungszeichenfolge geändert werden; siehe Unterstützte XMLA-Eigenschaften (XMLA) und ConnectionString zur Parameterverwendung.

Beispiele

Das folgende Beispiel ergibt die Summe des Measures.[Order Quantity] Mitglieds, aggregiert über die ersten acht Monate des Kalenderjahres 2003, die in der Date Dimension enthalten sind, aus dem Adventure Works-Würfel .

WITH MEMBER [Date].[Calendar].[First8Months2003] AS  
    Aggregate(  
        PeriodsToDate(  
            [Date].[Calendar].[Calendar Year],   
            [Date].[Calendar].[Month].[August 2003]  
        )  
    )  
SELECT   
    [Date].[Calendar].[First8Months2003] ON COLUMNS,  
    [Product].[Category].Children ON ROWS  
FROM  
    [Adventure Works]  
WHERE  
    [Measures].[Order Quantity]  

Um NON VISUAL zu verstehen, ist das folgende Beispiel eine Abfrage von [Adventure Works], um [Reseller Sales Amount]-Zahlen in einer Tabelle zu erhalten, in der die Produktkategorien die Spalten und die Reseller-Geschäftstypen die Zeilen sind. Beachten Sie, dass Gesamtsummen sowohl für Produkte als auch für Wiederverkäufer angegeben werden.

Die folgende SELECT-Anweisung:

select [Category].members on 0,  
[Business Type].members on 1  
from [Adventure Works]  
where [Measures].[Reseller Sales Amount]  

Erzeugt die folgenden Ergebnisse:

Geschäftstyp + Kategorie Alle Produkte Zubehör Bikes Clothing Components
Alle Wiederverkäufer $80,450,596,98 $571.297,93 $66,302,381,56 $1.777.840.84 $11.799.076,66
Fachgeschäft für Spezialräder $6.756,166,18 $65,125,48 $6.080.117,73 $252,933,91 $357,989,07
Wiederverkäufer mit Mehrwert $34.967.517,33 $175,002,81 $30,892,354,33 $592,385,71 $3.307.774,48
Warehouse $38,726,913,48 $331,169,64 $29,329,909,50 $932,521,23 $8,133,313,11

Um eine Tabelle mit nur Daten für die Zubehör- und Bekleidungsprodukte zu erstellen, könnten die Value Added Reseller und Warehouse-Reseller, wobei die Gesamtsummen beibehalten werden, mit NON VISUAL wie folgt geschrieben werden:

select [Category].members on 0,  
[Business Type].members on 1  
from NON VISUAL (Select {[Category].Accessories, [Category].Clothing} on 0,  
{[Business Type].[Value Added Reseller], [Business Type].[Warehouse]} on 1  
from [Adventure Works])  
where [Measures].[Reseller Sales Amount]  

Erzeugt die folgenden Ergebnisse:

Geschäftstyp + Kategorie Alle Produkte Zubehör Clothing
Alle Wiederverkäufer $80,450,596,98 $571.297,93 $1.777.840.84
Wiederverkäufer mit Mehrwert $34.967.517,33 $175,002,81 $592,385,71
Warehouse $38,726,913,48 $331,169,64 $932,521,23

Um eine Tabelle zu erstellen, die die Spalten visuell addiert, aber für Zeilensummen die wahre Summe aller [Kategorie] bringt, sollte die folgende Abfrage ausgegeben werden:

select [Category].members on 0,  
[Business Type].members on 1  
from NON VISUAL (Select {[Category].Accessories, [Category].Clothing} on 0  
from ( Select {[Business Type].[Value Added Reseller], [Business Type].[Warehouse]} on 0  
from [Adventure Works])  
)  
where [Measures].[Reseller Sales Amount]  

Beachten Sie, dass NON VISUAL nur auf [Kategorie] angewendet wird.

Die obige Abfrage erzeugt die folgenden Ergebnisse:

Geschäftstyp + Kategorie Alle Produkte Zubehör Clothing
Alle Wiederverkäufer $73,694,430,80 $506,172,45 $1,524,906,93
Mehrwert-Reseller $34.967.517,33 $175,002,81 $592,385,71
Lagerhaus $38,726,913,48 $331,169,64 $932,521,23

Im Vergleich zu den vorherigen Ergebnissen können Sie feststellen, dass die Zeile [Alle Wiederverkäufer] nun die angezeigten Werte für [Mehrwert-Wiederverkäufer] und [Lager] aufaddiert. Allerdings zeigt die Spalte [Alle Produkte] den Gesamtwert für alle Produkte, einschließlich der nicht angezeigten.

Das folgende Beispiel zeigt, wie berechnete Mitglieder in Subselects verwendet werden können, um sie zu filtern. Um diese Probe reproduzieren zu können, muss die Verbindung mit dem Verbindungszeichenfolge-Parameter subqueries=1 hergestellt werden.

select Measures.allmembers on 0  
from (  
Select { [Measures].[Reseller Sales Amount]  
, [Measures].[Reseller Total Product Cost]  
, [Measures].[Reseller Gross Profit]  
, [Measures].[Reseller Gross Profit Margin]  
} on 0  
from [Adventure Works]  
)  

Die obige Abfrage erzeugt die folgenden Ergebnisse:

Umsatzbetrag des Wiederverkäufers Gesamtproduktkosten für Wiederverkäufer Wiederverkäufer-Bruttogewinn Reseller-Bruttogewinnmarge
$80,450,596,98 79.980.114,38 $ 470.482,60 $ 0.58%