MDX 資料操作 - SELECT
從指定的 Cube 擷取資料。
語法
[ 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
提供 Cube 名稱的有效字串。
Tuple_Expression
傳回 Tuple 的有效多維度運算式 (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>
值省略 Cube 中的屬性,屬性的預設成員就會隱含地加入至交叉分析篩選器軸。
子選擇語句中的 NON VISUAL 選項可讓您篩選掉成員,同時保留 true 總計,而不是篩選總計。 這可讓您查詢前十名銷售量(人員/產品/區域),並取得所有查詢成員的真實銷售額總計,而不是傳回前十名的銷售總額。 如需詳細資訊,請參閱下列範例。
每當使用連接字串參數 子查詢=1 開啟連接時,導出成員就可以包含在 SELECT 查詢軸子句 > 中 < ;請參閱 支援的 XMLA 屬性 (XMLA) 和 ConnectionString 參數使用方式。 子選取中的匯出成員會提供一個範例。
自動存在
當 SELECT 語句中使用維度的兩個或多個屬性時,Analysis Services 會評估屬性的運算式,以確保這些屬性的成員會適當地限制為符合所有其他屬性的準則。 例如,假設您正在使用 Geography 維度中的屬性。 如果您有一個運算式會從 City 屬性傳回所有成員,而另一個運算式會將 Country 屬性的成員限制在歐洲的所有國家/地區,則這會導致 City 成員僅限於屬於歐洲國家/地區的城市。 Analysis Services 的這個特性稱為「自動存在」,僅適用于相同維度中的屬性。 自動存在僅適用于相同維度的屬性,因為它會嘗試防止其他屬性運算式包含一個屬性運算式中排除的維度記錄。 自動存在也可以理解為維度記錄上不同屬性運算式的結果交集。 請參閱下列範例:
//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 折扣 |
---|---|---|---|
Mountain-200 | $14,356,699.36 | $19,012.71 | 0.13% |
Road-250 | $9,377,457.68 | $4,032.47 | 0.04% |
Mountain-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% |
取得的產品集似乎與 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 折扣 |
---|---|---|---|
Mountain-200 | $14,356,699.36 | $19,012.71 | 0.13% |
Road-250 | $9,377,457.68 | $4,032.47 | 0.04% |
Mountain-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% |
在先前的範例中,我們建立了兩組:一個做為匯出運算式,另一個是常數運算式。 這些範例說明自動存在的不同類別。
自動存在可以對運算式套用深或淺層。 預設設定為深度。 下列範例將說明深層自動存在的概念。 在此範例中,我們會依 [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 折扣 |
---|---|---|---|
Mountain-200 | $14,356,699.36 | $19,012.71 | 0.13% |
Mountain-100 | $8,568,958.27 | $139,393.27 | 1.63% |
HL Mountain Frame | $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 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% |
女子山短褲 | $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 折扣 |
---|---|---|---|
Mountain-200 | $14,356,699.36 | $19,012.71 | 0.13% |
Mountain-100 | $8,568,958.27 | $139,393.27 | 1.63% |
HL Mountain Frame | $3,365,069.27 | $174.11 | 0.01% |
在上述結果中,切割會提供只包含 [Product] 群組中 [Mountain] 群組中 Preferred10Products 的產品的結果。[產品線];如預期般,因為 Preferred10Products 是常數運算式。
此結果集也被視為淺層自動存在。 這是因為運算式會在配量子句之前進行評估。 在上一個範例中,運算式是用於說明目的的常數運算式,以介紹概念。
您可以使用 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 折扣 |
---|---|---|---|
Mountain-200 | $14,356,699.36 | $19,012.71 | 0.13% |
Mountain-100 | $8,568,958.27 | $139,393.27 | 1.63% |
HL Mountain Frame | $3,365,069.27 | $174.11 | 0.01% |
您可以使用連接字串中的 AUTOEXISTS=[1|2|3] 參數來修改自動存在行為;如需參數使用方式,請參閱 支援的 XMLA 屬性 (XMLA) 和 ConnectionString 。
範例
下列範例會從 Adventure Works Cube 傳回包含在維度中 Date
歷年前 8 個月之成員的總 Measures.[Order Quantity]
和。
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]
若要瞭解 NON VISUAL, 下列範例是 [Adventure Works] 的查詢,可取得資料表中的 [Reseller Sales Amount] 數位,其中產品類別是資料行,而轉銷商業務類型是資料列。 請注意,產品與轉銷商都會提供總計。
下列 SELECT 語句:
select [Category].members on 0,
[Business Type].members on 1
from [Adventure Works]
where [Measures].[Reseller Sales Amount]
產生下列結果:
商務類型 + 類別 | 所有產品 | Accessories | 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 |
倉庫 | $38,726,913.48 | $331,169.64 | $29,329,909.50 | $932,521.23 | $8,133,313.11 |
若要只針對Accessories 和 Clothing 產品產生具有資料的資料表,增加值轉銷商和倉儲轉銷商,但保留整體總計可以使用 NON VISUAL 撰寫如下:
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 |
倉庫 | $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 |
Value Added Reseller | $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% |
另請參閱
MDX 中的重要概念(Analysis Services)
MDX 資料動作陳述式 (MDX)
使用查詢和交叉分析篩選器軸限制查詢 (MDX)