查詢中的子選擇

子選擇運算式是巢狀 SELECT 運算式,用於限制評估外部 SELECT 的 Cube 空間。 子選擇可讓您定義評估所有計算的新空間。

子選擇範例

先提供一個範例,說明子選擇如何協助產生所要的結果。 假設您被要求為多年來前 10 項暢銷產品的銷售行為產生資料表。

結果應該如下表所示:

 

所有年的總和

第 1 年

...

前 10 項暢銷產品的總和

 

 

 

產品 A

 

 

 

...

 

 

 

若要得到如上表的結果,可以撰寫下列 MDX 運算式:

SELECT [Date].[Calendar Year].MEMBERS on 0
     , TOPCOUNT( [Product].[Product].MEMBERS
               , 10
               , [Measures].[Sales Amount]
               ) ON 1
  FROM [Adventure Works]

傳回下列結果:

 

All Periods

CY 2005

CY 20062

CY 2007

CY 2008

All Products

$80,450,596.98

$8,065,435.31

$24,144,429.65

$32,202,669.43

$16,038,062.60

Mountain-200 Black, 38

$1,634,647.94

(null)

(null)

$894,207.97

$740,439.97

Mountain-200 Black, 42

$1,285,524.65

(null)

(null)

$722,137.65

$563,387.00

Mountain-200 Silver, 38

$1,181,945.82

(null)

(null)

$634,600.78

$547,345.03

Mountain-200 Black, 46

$995,927.43

(null)

(null)

$514,995.76

$480,931.68

Mountain-200 Silver, 42

$1,005,111.77

(null)

(null)

$529,543.29

$475,568.49

Mountain-200 Silver, 46

$975,932.56

(null)

(null)

$526,759.30

$449,173.26

Road-150 Red, 56

$792,228.98

$382,159.24

$410,069.74

(null)

(null)

Mountain-200 Black, 38

$1,471,078.72

(null)

$789,958.49

$681,120.23

(null)

Road-350-W Yellow, 48

$1,380,253.88

(null)

(null)

$744,988.37

$635,265.50

除了查詢傳回 9 項產品而不是 10 項產品,而且 All Products 總計反映所有產品的總和而不是所傳回前 9 項產品的總和 (在此例中),這非常接近我們所要的結果。 下列 MDX 查詢中提供另一個解決問題的嘗試:

SELECT [Date].[Calendar Year].MEMBERS on 0
     , TOPCOUNT( [Product].[Product].CHILDREN, 10, [Measures].[Sales Amount]) ON 1
  FROM [Adventure Works]

傳回下列結果:

 

All Periods

CY 2005

CY 2006

CY 2007

CY 2008

Mountain-200 Black, 38

$1,634,647.94

(null)

(null)

$894,207.97

$740,439.97

Mountain-200 Black, 42

$1,285,524.65

(null)

(null)

$722,137.65

$563,387.00

Mountain-200 Silver, 38

$1,181,945.82

(null)

(null)

$634,600.78

$547,345.03

Mountain-200 Black, 46

$995,927.43

(null)

(null)

$514,995.76

$480,931.68

Mountain-200 Silver, 42

$1,005,111.77

(null)

(null)

$529,543.29

$475,568.49

Mountain-200 Silver, 46

$975,932.56

(null)

(null)

$526,759.30

$449,173.26

Road-150 Red, 56

$792,228.98

$382,159.24

$410,069.74

(null)

(null)

Mountain-200 Black, 38

$1,471,078.72

(null)

$789,958.49

$681,120.23

(null)

Road-350-W Yellow, 48

$1,380,253.88

(null)

(null)

$744,988.37

$635,265.50

Road-150 Red, 62

$566,797.97

$234,018.86

$332,779.11

(null)

(null)

這非常接近所要的結果,因為只遺漏產品的總和。 這時可以開始調整上述 MDX 運算式,加入遺漏的一行;不過,該項工作相當繁雜。

另一個解決問題的作法是從重新定義解析 MDX 運算式的 Cube 空間開始思考。 假設「新的」Cube 只包含前 10 項產品的資料? 該 Cube 就會將 All 成員調整為僅限前 10 項產品,現在只要簡單查詢即可解決需求。

下列 MDX 運算式使用子選擇陳述式,將 Cube 空間重新定義為前 10 項產品並產生所要的結果:

SELECT [Date].[Calendar Year].MEMBERS on 0
     , [Product].[Product].MEMBERS on 1
  FROM (SELECT TOPCOUNT( [Product].[Product].CHILDREN
                       , 10
                       , [Measures].[Sales Amount]
                       ) ON 0
          FROM [Adventure Works]
        )
 WHERE [Measures].[Sales Amount]

上述運算式會傳回下列結果:

 

All Periods

CY 2005

CY 2006

CY 2007

CY 2008

All Products

$19,997,183.30

$1,696,815.63

$2,816,611.28

$7,930,797.72

$7,552,958.66

Mountain-200 Silver, 38

$2,160,981.60

(null)

(null)

$1,024,359.10

$1,136,622.49

Mountain-200 Silver, 42

$1,914,547.85

(null)

(null)

$903,061.68

$1,011,486.18

Mountain-200 Silver, 46

$1,906,248.55

(null)

(null)

$877,077.79

$1,029,170.76

Mountain-200 Black, 38

$1,811,229.02

(null)

$896,511.60

$914,717.43

(null)

Mountain-200 Black, 38

$2,589,363.78

(null)

(null)

$1,261,406.37

$1,327,957.41

Mountain-200 Black, 42

$2,265,485.38

(null)

(null)

$1,126,055.89

$1,139,429.49

Mountain-200 Black, 46

$1,957,528.24

(null)

(null)

$946,453.88

$1,011,074.37

Road-150 Red, 62

$1,769,096.69

$828,011.68

$941,085.01

(null)

(null)

Road-150 Red, 56

$1,847,818.63

$868,803.96

$979,014.67

(null)

(null)

Road-350-W Yellow, 48

$1,774,883.56

(null)

(null)

$877,665.59

$897,217.96

上述結果正是我們所要的結果。

讓我們檢閱子選擇實際上執行哪些工作。 子選擇傳回新 Cube,其中包含產品的所有其他不變維度,但在產品維度中會篩選所有成員,以符合我們有興趣的前 10 項產品, 如同移除所有不符合「前 10 個」準則的所有資料並重新建立 Cube 一樣。 此範例中另一個要了解的重要概念是,前 10 項產品是對 Cube 中所有其他維度的 All 成員計算而得的;前者為 True 因為子選擇中未加入其他篩選限制。

子選擇可以視需要變得複雜,下列範例示範如何產生類似上表的資料表,但在 Sales Territory 維度上篩選 France 以及在 Sales Channel 維度上篩選 Internet。

SELECT [Date].[Calendar Year].MEMBERS on 0
     , [Product].[Product].MEMBERS on 1
  FROM (SELECT TOPCOUNT( [Product].[Product].CHILDREN
                       , 10
                       , [Measures].[Sales Amount]
                       ) ON 0
             , [Sales Territory].[Sales Territory].[Region].[France] on 1
             ,  [Sales Channel].[Sales Channel].[Internet] on 2
          FROM [Adventure Works]
        )
 WHERE [Measures].[Sales Amount]

產生下列結果:

 

All Periods

CY 2005

CY 2006

CY 2007

CY 2008

All Products

$748,682.49

$32,204.43

$73,125.18

$269,506.56

$373,846.32

Mountain-200 Silver, 38

$90,479.61

(null)

(null)

$41,759.82

$48,719.79

Mountain-200 Silver, 42

$97,439.58

(null)

(null)

$39,439.83

$57,999.75

Mountain-200 Silver, 46

$102,079.56

(null)

(null)

$27,839.88

$74,239.68

Mountain-200 Black, 38

$26,638.28

(null)

$12,294.59

$14,343.69

(null)

Mountain-200 Black, 38

$96,389.58

(null)

(null)

$41,309.82

$55,079.76

Mountain-200 Black, 42

$80,324.65

(null)

(null)

$43,604.81

$36,719.84

Mountain-200 Black, 46

$107,864.53

(null)

(null)

$45,899.80

$61,964.73

Road-150 Red, 62

$46,517.51

$14,313.08

$32,204.43

(null)

(null)

Road-150 Red, 56

$46,517.51

$17,891.35

$28,626.16

(null)

(null)

Road-350-W Yellow, 48

$54,431.68

(null)

(null)

$15,308.91

$39,122.77

上述結果是在法國透過網際網路通路銷售的前 10 項暢銷產品。

子選擇陳述式

子選擇的 BNF 為:

[WITH [<calc-clause> ...]]
SELECT [<axis-spec> [, <axis-spec> ...]]
FROM [<identifier> | (< sub-select-statement >)]
[WHERE <slicer>]
[[CELL] PROPERTIES <cellprop> [, <cellprop> ...]]

< sub-select-statement > :=
   SELECT [<axis-spec> [, <axis-spec> ...]]
   FROM [<identifier> | (< sub-select-statement >)]
   [WHERE <slicer>]

子選擇是另一種 Select 陳述式,其中軸規格和 slicer 規格篩選要評估外部 Select 的 Cube 空間。

在 axis 或 slicer 子句的其中一個指定成員時,該成員及其上階和下階就會包含在子選擇的 Subcube 空間中;在 axis 或 slicer 子句中,所有未提及的同層級成員 (以及其上階和下階) 都會篩選排除在子空間之外。 這樣一來,如上述,外部 Select 的空間已經限制為 axis 子句或 slicer 子句中的現有成員,以及其上階和下階。

因為 axis 或 slicer 子句中所有未提及維度的 All 成員屬於 Select 的空間,所以在這些維度上 All 成員的所有下階也會成為子選擇空間的一部分。

Subcube 空間中所有維度的 All 成員會重新評估,以反映新空間限制的影響。

下列範例示範上述說明;第一個 MDX 運算式協助顯示 Cube 中未篩選的值,第二個 MDX 示範 Subselect 子句中的篩選影響:

SELECT { [Customer].[Customer Geography].[All Customers]
       , [Customer].[Customer Geography].[Country].&[United States]
       , [Customer].[Customer Geography].[State-Province].&[OR]&[US]
       , [Customer].[Customer Geography].[City].&[Portland]&[OR]
       , [Customer].[Customer Geography].[State-Province].&[WA]&[US]
       , [Customer].[Customer Geography].[City].&[Seattle]&[WA]
       } ON 1
     ,  {[Measures].[Internet Sales Amount], [Measures].[Reseller Sales Amount]} ON 0
  FROM [Adventure Works]

傳回下列值:

 

Internet Sales Amount

Reseller Sales Amount

All Customers

$29,358,677.22

$80,450,596.98

United States

$9,389,789.51

$80,450,596.98

Oregon

$1,170,991.54

$80,450,596.98

Portland

$110,649.54

$80,450,596.98

Washington

$2,467,248.34

$80,450,596.98

Seattle

$75,164.86

$80,450,596.98

在上述範例中,Seattle 是 Washington 的子系,Portland 是 Oregon 的子系,Oregon 和 Washington 是 United States 的子系,而 United States 則是 [Customer Geography].[All Customers] 的子系。 這個範例中所有顯示的成員有其他同層級對父彙總值有貢獻;例如 Spokane、Tacoma 和 Everett 是 Seattle 的同層級城市,這些成員對 Washington Internet Sales Amount 都有貢獻。 Reseller Sales Amount 值獨立於 Customer Geography 屬性之外,因此 All 值會顯示在結果中。 下一個 MDX 運算式示範 Subselect 子句的篩選影響:

SELECT { [Customer].[Customer Geography].[All Customers]
       , [Customer].[Customer Geography].[Country].&[United States]
       , [Customer].[Customer Geography].[State-Province].&[OR]&[US]
       , [Customer].[Customer Geography].[City].&[Portland]&[OR]
       , [Customer].[Customer Geography].[State-Province].&[WA]&[US]
       , [Customer].[Customer Geography].[City].&[Seattle]&[WA]
       } ON 1
     ,  {[Measures].[Internet Sales Amount], [Measures].[Reseller Sales Amount]} ON 0
  FROM ( SELECT [Customer].[State-Province].&[WA]&[US] ON 0
           FROM [Adventure Works]
        )

傳回下列值:

 

Internet Sales Amount

Reseller Sales Amount

All Customers

$2,467,248.34

$80,450,596.98

United States

$2,467,248.34

$80,450,596.98

Washington

$2,467,248.34

$80,450,596.98

Seattle

$75,164.86

$80,450,596.98

上述結果顯示只有 Washington State 的上階和下階是評估外部 Select 陳述式之子空間的一部分;Oregon 和 Portland 已從 Subcube 移除,因為在提及 Washington 時子選擇中未提及 Oregon 和所有其他同層級州。

All 成員已調整反映 Washington 的篩選;不但在 [Customer Geography] 維度中,而且在與 [Customer Geography] 相交的所有其他維度中也已經調整。 未與 [Customer Geography] 相交的所有維度,在 Subcube 中保持不變。

下列兩個 MDX 陳述式示範在其他維度中的 All 成員如何調整,以符合子選擇的篩選影響。 第一個查詢顯示不變的結果,第二個則顯示篩選影響:

SELECT { [Customer].[Customer Geography].[All Customers]
       , [Customer].[Customer Geography].[Country].&[United States]
       , [Customer].[Customer Geography].[State-Province].&[OR]&[US]
       , [Customer].[Customer Geography].[City].&[Portland]&[OR]
       , [Customer].[Customer Geography].[State-Province].&[WA]&[US]
       , [Customer].[Customer Geography].[City].&[Seattle]&[WA]
       } ON 1
     ,   [Product].[Product Line].MEMBERS ON 0
  FROM [Adventure Works]
 WHERE [Measures].[Internet Sales Amount]

 

All Products

Accessory

Components

Mountain

Road

Touring

All Customers

$29,358,677.22

$604,053.30

(null)

$10,251,183.52

$14,624,108.58

$3,879,331.82

United States

$9,389,789.51

$217,168.79

(null)

$3,547,956.78

$4,322,438.41

$1,302,225.54

Oregon

$1,170,991.54

$30,513.17

(null)

$443,607.98

$565,372.10

$131,498.29

Portland

$110,649.54

$2,834.17

(null)

$47,099.91

$53,917.17

$6,798.29

Washington

$2,467,248.34

$62,662.92

(null)

$945,219.38

$1,155,880.07

$303,485.97

Seattle

$75,164.86

$2,695.74

(null)

$19,914.53

$44,820.06

$7,734.54

SELECT { [Customer].[Customer Geography].[All Customers]
       , [Customer].[Customer Geography].[Country].&[United States]
       , [Customer].[Customer Geography].[State-Province].&[OR]&[US]
       , [Customer].[Customer Geography].[City].&[Portland]&[OR]
       , [Customer].[Customer Geography].[State-Province].&[WA]&[US]
       , [Customer].[Customer Geography].[City].&[Seattle]&[WA]
       } ON 1
     ,   [Product].[Product Line].MEMBERS ON 0
  FROM ( SELECT [Customer].[State-Province].&[WA]&[US] ON 0
           FROM [Adventure Works]
        )
 WHERE [Measures].[Internet Sales Amount]

 

All Products

Accessory

Components

Mountain

Road

Touring

All Customers

$2,467,248.34

$62,662.92

(null)

$945,219.38

$1,155,880.07

$303,485.97

United States

$2,467,248.34

$62,662.92

(null)

$945,219.38

$1,155,880.07

$303,485.97

Washington

$2,467,248.34

$62,662.92

(null)

$945,219.38

$1,155,880.07

$303,485.97

Seattle

$75,164.86

$2,695.74

(null)

$19,914.53

$44,820.06

$7,734.54

如預期,上述結果顯示 All Products 值已經調整為僅限來自 Washington State 的值。

除了可用記憶體的限制之外,子選擇可以巢狀處理,巢狀深度不受限制。 最內部的子選擇定義套用篩選的起始子空間,接著是下一個外部 Select。 值得注意的是巢狀不是累積作業,因此巢狀設定順序可能會產生不同的結果。 下列範例應該會顯示選擇巢狀順序時的差異。

SELECT [Sales Territory].[Sales Territory Region].MEMBERS on 0
     , [Product].[Product].MEMBERS on 1
  FROM (SELECT TOPCOUNT( [Product].[Product].CHILDREN, 5, [Measures].[Sales Amount]) ON 0
          FROM (SELECT TOPCOUNT( [Sales Territory].[Sales Territory Region].CHILDREN, 5, [Measures].[Sales Amount]) on 0
                  FROM [Adventure Works]
               )
        )
 WHERE [Measures].[Sales Amount]

傳回下列結果。

 

All Sales Territories

Australia

Canada

Central

Northwest

Southwest

All Products

$7,591,495.49

$1,281,059.99

$1,547,298.12

$600,205.79

$1,924,763.50

$2,238,168.08

Mountain-200 Silver, 38

$1,449,576.15

$248,702.93

$275,052.45

$141,103.65

$349,487.01

$435,230.12

Mountain-200 Black, 38

$1,722,896.50

$218,024.05

$418,726.43

$123,929.46

$486,694.63

$475,521.93

Mountain-200 Black, 42

$1,573,655.14

$239,137.96

$319,921.61

$130,102.75

$420,445.84

$464,046.98

Mountain-200 Black, 46

$1,420,500.58

$192,320.16

$230,875.99

$117,044.49

$424,813.66

$455,446.27

Road-150 Red, 56

$1,424,867.11

$382,874.89

$302,721.64

$88,025.44

$243,322.36

$407,922.78

SELECT [Sales Territory].[Sales Territory Region].MEMBERS on 0
     , [Product].[Product].MEMBERS on 1
  FROM (SELECT TOPCOUNT( [Sales Territory].[Sales Territory Region].CHILDREN, 5, [Measures].[Sales Amount]) ON 0
          FROM (SELECT TOPCOUNT( [Product].[Product].CHILDREN, 5, [Measures].[Sales Amount]) on 0
                  FROM [Adventure Works]
               )
        )
 WHERE [Measures].[Sales Amount]

傳回下列結果。

 

All Sales Territories

Australia

Canada

Northwest

Southwest

United Kingdom

All Products

$7,938,218.56

$1,096,312.24

$1,474,255.49

$2,042,674.72

$2,238,099.55

$1,086,876.56

Mountain-200 Silver, 38

$1,520,958.53

$248,702.93

$275,052.45

$349,487.01

$435,230.12

$212,486.03

Mountain-200 Silver, 42

$1,392,237.14

$198,127.15

$229,679.01

$361,233.58

$407,854.24

$195,343.16

Mountain-200 Black, 38

$1,861,703.23

$218,024.05

$418,726.43

$486,694.63

$475,521.93

$262,736.19

Mountain-200 Black, 42

$1,702,427.25

$239,137.96

$319,921.61

$420,445.84

$464,046.98

$258,874.87

Mountain-200 Black, 46

$1,460,892.41

$192,320.16

$230,875.99

$424,813.66

$455,446.27

$157,436.31

如您所見,這兩組的結果有差異。 第一個查詢回答在前 5 個銷售區域中最暢銷產品為何的問題,第二個查詢回答前 5 項暢銷產品最大銷售量在哪裡的問題。

備註

子選擇有下列限制:

  • WHERE 子句不會篩選子空間。

  • WHERE 子句只變更 Subcube 的預設成員。

  • axis 子句中不允許 NON EMPTY 子句;請改用 NonEmpty (MDX) 函數運算式。

  • axis 子句中不允許 HAVING 子句;請改用 Filter (MDX) 函數運算式。

  • 根據預設,子選擇中不允許導出成員;不過這項限制可根據每個工作階段變更,方法是將值指派給 ConnectionString 中的 SubQueries 連接字串屬性或 支援的 XMLA 屬性 (XMLA) 中的 DBPROP_MSMD_SUBQUERIES 屬性。 如需根據 SubQueries 或 DBPROP_MSMD_SUBQUERIES 的值導出成員之行為的詳細說明,請參閱<子選擇和 Subcube 中的導出成員>。