MDX 資料操作 - SELECT

從指定的立方體中擷取資料。

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 ] )  

論點

Set_Expression
一個有效的多維表達式(MDX)表達式,能回傳一個集合。

整數
介於 0 到 127 之間的整數。

Cube_Name
一個有效的字串,提供立方體名稱。

Tuple_Expression
一個有效的多維表達式(MDX)表達式,回傳元組。

CellProperty_Name
一個有效的字串,代表一個單元屬性。

DimensionProperty_Name
一個有效的字串,代表維度性質。

LevelProperty_Name
一個有效的字串,代表一個層級屬性。

MemberProperty_Name
一個有效字串,代表成員屬性。

備註

表達式 <SELECT slicer axis clause> 必須包含與指定 <SELECT query axis clause> 表達式所引用的維度與階層結構不同的成員。

如果立方體中的某個屬性在指定的 <SELECT query axis clause> 表達式和 <SELECT slicer axis clause> 值中被省略,該屬性的預設成員會隱含地加入切片器軸。

子選擇語句中的非視覺化選項允許你過濾成員,同時保留真實總數而非過濾後的總數。 這讓你能查詢前十名銷售額(個人/產品/地區),並取得所有被查詢會員的真實銷售總額,而非前十名的總銷售額。 更多資訊請參考下方範例。

計算出的成員可在開啟連線時包含<於 SELECT 查詢軸子句>中,使用 連接字串 參數 subqueries=1;詳見支援的 XMLA 屬性(XMLA)ConnectionString參數使用。 在子選擇中,計算成員的範例為例。

自動存在

當 SELECT 語句中使用該維度的兩個或以上屬性時,Analysis Services 會評估這些屬性的表達式,以確保這些屬性的成員被適當限制,以符合所有其他屬性的標準。 例如,假設您正在使用 Geography 維度中的屬性。 如果你有一個表達式回傳 City 屬性的所有成員,另一個表達式將國家屬性的成員限制在歐洲所有國家/地區,那麼 City 成員只會侷限於屬於歐洲國家/地區的城市。 分析服務的這個特性稱為自動存在(Autoexists),僅適用於同一維度的屬性。 自動存在僅適用於相同維度的屬性,因為它會嘗試防止其他屬性運算式包含一個屬性表達式中排除的維度記錄。 自存在也可以理解為不同屬性表達式在維度記錄上的交集。 請參考以下範例:

//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]  

取得的結果集為:

型號名稱 + 測量 轉銷商銷售金額 折扣金額 PCT 折扣
山-200 14,356,699.36美元 $19,012.71 0.13%
250號公路 9,377,457.68美元 4,032.47美元 0.04%
山-100 8,568,958.27美元 $139,393.27 1.63%
650號公路 7,442,141.81美元 39,698.30美元 0.53%
旅行-1000 6,723,794.29美元 166,144.17美元 2.47%
Road-550-W 3,668,383.88美元 $1,901.97 0.05%
道路-350-W 3,665,932.31美元 20,946.50美元 0.57%
HL 山地框架 3,365,069.27美元 174.11美元 0.01%
道路150 2,363,805.16美元 0.00美元 0.00%
巡迴賽-3000 2,046,508.26美元 79,582.15美元 3.89%

取得的產品集似乎與 Preferred10Products 相同;因此,確認 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]  

根據下列結果,這兩個集合 (Top10SellingProducts, Preferred10Products) 都相同

型號名稱 + 測量 轉銷商銷售金額 折扣金額 PCT 折扣
山-200 14,356,699.36美元 $19,012.71 0.13%
250號公路 9,377,457.68美元 4,032.47美元 0.04%
山-100 8,568,958.27美元 $139,393.27 1.63%
650號公路 7,442,141.81美元 39,698.30美元 0.53%
旅行-1000 6,723,794.29美元 166,144.17美元 2.47%
Road-550-W 3,668,383.88美元 $1,901.97 0.05%
道路-350-W 3,665,932.31美元 20,946.50美元 0.57%
HL 山地框架 3,365,069.27美元 174.11美元 0.01%
道路150 2,363,805.16美元 0.00美元 0.00%
巡迴賽-3000 2,046,508.26美元 79,582.15美元 3.89%

在前面的例子中,我們建立了兩個集合:一個是計算出的表達式,另一個是常數表達式。 這些例子說明了 Autoexist 的不同風格。

自動存在可以應用在表達式中,也可以是深層或淺層。 預設設定是深度。 下列範例將說明深層自動存在的概念。 在此範例中,我們會依 [Product] 篩選 Top10SellingProducts。[Mountain] 群組中的 [Product Line] 屬性。 請注意,這兩個屬性(交叉分析篩選器和軸)都屬於相同的維度 [Product]。

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]  

產生下列結果集:

型號名稱 + 測量 轉銷商銷售金額 折扣金額 PCT 折扣
山-200 14,356,699.36美元 $19,012.71 0.13%
山-100 8,568,958.27美元 $139,393.27 1.63%
HL 山地框架 3,365,069.27美元 174.11美元 0.01%
Mountain-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 山地框架 521,864.42美元 $252.41 0.05%
ML 山地自行車車架-W 482,953.16美元 $206.95 0.04%
ML 山地框架 343,785.29美元 161.82美元 0.05%
女子山地短褲 260,304.09美元 6,675.56美元 2.56%

在先前的結果集中,我們有七位新加入 Top10SellingProducts 的品牌,而 Mountain-200、Mountain-100 和 HL Mountain Frame 則躍居榜首。 在之前的結果集中,這三個數值被穿插在一起

這稱為 Deep Autoexists,因為會評估 Top10SellingProducts 集合以符合查詢的切割條件。 深層自動存在表示所有表達式都會在套用交叉分析篩選器表達式、座標軸中的子選取表達式等之後評估,以符合最深的空間。

不過,您可能想要能夠對 Top10SellingProducts 執行分析,相當於 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]  
where [Product].[Product Line].[Mountain]  

產生下列結果集:

型號名稱 + 測量 轉銷商銷售金額 折扣金額 PCT 折扣
山-200 14,356,699.36美元 $19,012.71 0.13%
山-100 8,568,958.27美元 $139,393.27 1.63%
HL 山地框架 3,365,069.27美元 174.11美元 0.01%

在上述結果中,切割會提供只包含 [Product] 群組中 [Mountain] 群組中 Preferred10Products 的產品的結果。[產品線];如預期般,因為 Preferred10Products 是常數表達式。

此結果集也被理解為淺層自動存在。 這是因為表達式會在配量子句之前進行評估。 在上一個範例中,表達式是用於說明目的的常數表達式,以介紹概念。

Autoexists 的行為可以在會話層級使用 Autoexists 連接字串特性進行修改。 以下範例從開啟新工作階段開始,並在連接字串中加入 Autoexists=3 屬性。 您必須開啟新的連線,才能執行此範例。 一旦使用 [自動存在] 設定建立連線,它就會維持有效狀態,直到該聯機完成為止。

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]  

下列結果集現在會顯示 Autoexists 的淺層行為。

型號名稱 + 測量 轉銷商銷售金額 折扣金額 PCT 折扣
山-200 14,356,699.36美元 $19,012.71 0.13%
山-100 8,568,958.27美元 $139,393.27 1.63%
HL 山地框架 3,365,069.27美元 174.11美元 0.01%

Autoexists 的行為可以透過在連接字串中使用 AUTOEXISTS=[1|2|3] 參數來修改;請參閱 支援的 XMLA 屬性(XMLA)ConnectionString 參數使用。

Examples

以下範例回傳了 Adventure Works 立方體中 2003 年曆年前八個月內成員的總和Measures.[Order Quantity],這些時間包含在該Date維度中。

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]  

為了理解 非視覺化 ,以下範例是查詢 [Adventure Works] 以取得表格中的 [經銷商銷售金額]數字,其中產品類別為欄位,經銷商業務類型為列。 請注意,總數會同時列出產品和經銷商。

以下 SELECT 聲明:

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

產生下列結果:

商業類型+類別 所有產品 輔料 Bikes Clothing Components
所有經銷商 80,450,596.98美元 571,297.93美元 66,302,381.56美元 $1,777,840.84 11,799,076.66美元
特色自行車店 6,756,166.18美元 65,125.48美元 6,080,117.73美元 252,933.91美元 357,989.07美元
增值經銷商 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美元

若要製作一張僅包含配件與服裝產品、增值經銷商及倉庫經銷商的資料表,但可使用非視覺化方式撰寫以下總數以保留總數:

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]  

產生下列結果:

商業類型+類別 所有產品 輔料 Clothing
所有經銷商 80,450,596.98美元 571,297.93美元 $1,777,840.84
增值經銷商 34,967,517.33美元 $175,002.81 592,385.71美元
Warehouse 38,726,913.48美元 331,169.64美元 932,521.23美元

若要產生以可視化方式計算數據行總計但針對數據列總計的數據表,應該發出下列查詢:所有 [Category] 的真正總計:

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]  

請注意,NON VISUAL 如何只套用至 [Category]。

上述查詢會產生下列結果:

商業類型+類別 所有產品 輔料 Clothing
所有經銷商 $73,694,430.80 $506,172.45 $1,524,906.93
增值轉銷商 $34,967,517.33 $175,002.81 $592,385.71
倉儲 $38,726,913.48 $331,169.64 $932,521.23

相較於先前的結果,您可以觀察 [所有轉銷商] 數據列現在會加總至 [增值轉銷商] 和 [Warehouse] 的顯示值,但 [所有產品] 數據行會顯示所有產品的總計值,包括未顯示的值。

以下範例示範如何在子選擇中使用計算出的成員來過濾它們。 若要重現此範例,必須使用 連接字串 參數子查詢=1建立連結。

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]  
)  

上述查詢會產生下列結果:

轉銷商銷售金額 經銷商總產品成本 經銷商毛利 經銷商毛利
$80,450,596.98 79,980,114.38美元 $470,482.60 0.58%