查詢中的子選取

適用於: SQL Server Analysis Services Azure Analysis Services Fabric/Power BI Premium

子選取表達式是巢狀 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]  

這會傳回下列結果:

所有期間 CY 2005 CY 2006 CY 2007 CY 2008
所有產品 $80,450,596.98 $8,065,435.31 $24,144,429.65 $32,202,669.43 $16,038,062.60
山-200黑色, 38 $1,634,647.94 (null) (null) $894,207.97 $740,439.97
山-200 黑色, 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
山-200 黑色, 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
山-200銀,46 $975,932.56 (null) (null) $526,759.30 $449,173.26
路-150紅色,56 $792,228.98 $382,159.24 $410,069.74 (null) (null)
山-200黑色, 38 $1,471,078.72 (null) $789,958.49 $681,120.23 (null)
路-350-W 黃,48 $1,380,253.88 (null) (null) $744,988.37 $635,265.50

這非常接近我們正在尋找的內容:除了查詢傳回 9 個不是 10 個產品,而所有產品總計會反映所有產品的總和,而不是傳回的前 9 名的總和(在此案例中為)。 下列 MDX 查詢中會顯示另一個解決問題的嘗試:

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

這會傳回下列結果:

所有期間 CY 2005 CY 2006 CY 2007 CY 2008
山-200黑色, 38 $1,634,647.94 (null) (null) $894,207.97 $740,439.97
山-200 黑色, 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
山-200 黑色, 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
山-200銀,46 $975,932.56 (null) (null) $526,759.30 $449,173.26
路-150紅色,56 $792,228.98 $382,159.24 $410,069.74 (null) (null)
山-200黑色, 38 $1,471,078.72 (null) $789,958.49 $681,120.23 (null)
路-350-W 黃,48 $1,380,253.88 (null) (null) $744,988.37 $635,265.50
路-150 紅色,62 $566,797.97 $234,018.86 $332,779.11 (null) (null)

這非常接近預期的結果,因為它只錯過了產品的總和。 此時,您可以開始調整上述 MDX 運算式以新增遺漏行;然而,這項工作可能證明是一個麻煩的工作。

另一個解決問題的方法,就是在重新定義 MDX 運算式解決所在的 Cube 空間方面開始思考。 如果 'new' 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]  

上述表示式會傳回下列結果:

所有期間 CY 2005 CY 2006 CY 2007 CY 2008
所有產品 $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
山-200銀,46 $1,906,248.55 (null) (null) $877,077.79 $1,029,170.76
山-200黑色, 38 $1,811,229.02 (null) $896,511.60 $914,717.43 (null)
山-200黑色, 38 $2,589,363.78 (null) (null) $1,261,406.37 $1,327,957.41
山-200 黑色, 42 $2,265,485.38 (null) (null) $1,126,055.89 $1,139,429.49
山-200 黑色, 46 $1,957,528.24 (null) (null) $946,453.88 $1,011,074.37
路-150 紅色,62 $1,769,096.69 $828,011.68 $941,085.01 (null) (null)
路-150紅色,56 $1,847,818.63 $868,803.96 $979,014.67 (null) (null)
路-350-W 黃,48 $1,774,883.56 (null) (null) $877,665.59 $897,217.96

上述結果正是我們要尋找的結果。

讓我們來檢閱子選擇為我們所做的確切作業。 子選擇會為我們傳回新的 Cube,其中包含產品中的所有其他維度;但在產品維度中,它會篩選所有成員,以符合我們感興趣的前10個產品。 就像我們移除了不符合前 10 個準則且重建 Cube 的所有數據一樣。 本範例中要瞭解的另一個重要概念是,前10個產品是透過Cube中所有其他維度的All成員來計算;前者為 true,因為未在子選取中套用其他篩選限制。

子選擇可以和一樣複雜;下列範例將說明如何產生類似上述的數據表,但在 Sales Territory 維度和因特網上針對 Sales Channel 維度篩選法國。

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]  

產生下列結果:

所有期間 CY 2005 CY 2006 CY 2007 CY 2008
所有產品 $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
山-200銀,46 $102,079.56 (null) (null) $27,839.88 $74,239.68
山-200黑色, 38 $26,638.28 (null) $12,294.59 $14,343.69 (null)
山-200黑色, 38 $96,389.58 (null) (null) $41,309.82 $55,079.76
山-200 黑色, 42 $80,324.65 (null) (null) $43,604.81 $36,719.84
山-200 黑色, 46 $107,864.53 (null) (null) $45,899.80 $61,964.73
路-150 紅色,62 $46,517.51 $14,313.08 $32,204.43 (null) (null)
路-150紅色,56 $46,517.51 $17,891.35 $28,626.16 (null) (null)
路-350-W 黃,48 $54,431.68 (null) (null) $15,308.91 $39,122.77

上述結果是法國通過互聯網渠道銷售的前十大產品。

Subselect 語句

Subselect 的 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語句,其中座標軸規格和交叉分析篩選器規格會篩選評估外部選取所在的 Cube 空間。

在其中一個座標軸或交叉分析篩選器子句中指定成員時,該成員及其上階和子系會包含在子選取的子 Cube 空間中;軸或交叉分析篩選器子句中所有未提及的同層級成員,以及其子系都會從子空間篩選。 如此一來,外部選取範圍的空間僅限於軸子句或交叉分析篩選器子句中的現有成員,其上階和子系如前所述。

因為軸或交叉分析篩選器子句中所有未提及維度的所有成員都屬於選取的空間;然後,這些維度上 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]  

傳回下列值:

因特網銷售金額 轉銷商銷售金額
所有客戶 $29,358,677.22 $80,450,596.98
美國 $9,389,789.51 $80,450,596.98
俄勒岡州 $1,170,991.54 $80,450,596.98
波特蘭 $110,649.54 $80,450,596.98
華盛頓 $2,467,248.34 $80,450,596.98
西雅圖 $75,164.86 $80,450,596.98

在上述範例中,Seattle 是華盛頓的子系,波特蘭是俄勒岡州、俄勒岡州和華盛頓的子系,而美國則是 [客戶地理位置] 的子系。[所有客戶]。 此範例中所有顯示的成員都有其他同層級,可參與父匯總值;即斯波坎、塔科馬和埃弗特是西雅圖的兄弟姐妹城市,他們都為華盛頓互聯網銷售金額做出了貢獻。 轉銷商銷售金額值與 Customer Geography 屬性無關;因此,結果中會顯示All值。 下一個 MDX 運算式說明子選取子句的篩選效果:

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

傳回下列值:

因特網銷售金額 轉銷商銷售金額
所有客戶 $2,467,248.34 $80,450,596.98
美國 $2,467,248.34 $80,450,596.98
華盛頓 $2,467,248.34 $80,450,596.98
西雅圖 $75,164.86 $80,450,596.98

上述結果顯示,只有華盛頓州的上階和子系是評估外部 select 語句的子空間的一部分:俄勒岡州和波特蘭已經從子庫中移除,因為俄勒岡州和所有其他兄弟姐妹州在被提及華盛頓時沒有提及。

“所有成員”已調整,以反映對華盛頓的篩選:不僅已在 [Customer Geography] 維度中調整,而且在與 [Customer Geography] 交叉的所有其他維度中調整。 未與 [Customer Geography] 交叉的所有維度都會保留在 Subcube 中未變更。

下列兩個 MDX 語句說明如何調整其他維度中的所有成員,以符合子選取的篩選效果。 第一個查詢會顯示未結束的結果,第二個查詢會顯示篩選的影響:

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]  
所有產品 附屬品 元件 旅遊
所有客戶 $29,358,677.22 $604,053.30 (null) $10,251,183.52 $14,624,108.58 $3,879,331.82
美國 $9,389,789.51 $217,168.79 (null) $3,547,956.78 $4,322,438.41 $1,302,225.54
俄勒岡州 $1,170,991.54 $30,513.17 (null) $443,607.98 $565,372.10 $131,498.29
波特蘭 $110,649.54 $2,834.17 (null) $47,099.91 $53,917.17 $6,798.29
華盛頓 $2,467,248.34 $62,662.92 (null) $945,219.38 $1,155,880.07 $303,485.97
西雅圖 $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]  
所有產品 附屬品 元件 旅遊
所有客戶 $2,467,248.34 $62,662.92 (null) $945,219.38 $1,155,880.07 $303,485.97
美國 $2,467,248.34 $62,662.92 (null) $945,219.38 $1,155,880.07 $303,485.97
華盛頓 $2,467,248.34 $62,662.92 (null) $945,219.38 $1,155,880.07 $303,485.97
西雅圖 $75,164.86 $2,695.74 (null) $19,914.53 $44,820.06 $7,734.54

上述結果顯示,所有產品值都已調整為僅來自華盛頓州的值,如預期般。

子選擇可以巢狀化,但您可以巢狀子選取的深度,但可用的記憶體除外。 最內部的子選擇會定義套用篩選的起始子空間,並傳遞至下一個外部選取。 請注意的一個重要事項是巢狀不是通勤作業:因此,巢狀設定的順序會讓我產生不同的結果。 下列範例應該會顯示在選擇巢狀順序時的差異。

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]  

傳回下列結果。

所有銷售領域 澳大利亞 加拿大 中央 西北 西南
所有產品 $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
山-200黑色, 38 $1,722,896.50 $218,024.05 $418,726.43 $123,929.46 $486,694.63 $475,521.93
山-200 黑色, 42 $1,573,655.14 $239,137.96 $319,921.61 $130,102.75 $420,445.84 $464,046.98
山-200 黑色, 46 $1,420,500.58 $192,320.16 $230,875.99 $117,044.49 $424,813.66 $455,446.27
路-150紅色,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]  

傳回下列結果。

所有銷售領域 澳大利亞 加拿大 西北 西南 英國
所有產品 $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
山-200黑色, 38 $1,861,703.23 $218,024.05 $418,726.43 $486,694.63 $475,521.93 $262,736.19
山-200 黑色, 42 $1,702,427.25 $239,137.96 $319,921.61 $420,445.84 $464,046.98 $258,874.87
山-200 黑色, 46 $1,460,892.41 $192,320.16 $230,875.99 $424,813.66 $455,446.27 $157,436.31

如您所見,這兩個集合的結果有差異。 第一個查詢回答了在前 5 個銷售區域中最暢銷的產品的問題,第二個查詢回答了其中前 5 名銷售產品的最大銷售量的問題。

言論

子選擇具有下列限制和限制:

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

  • WHERE 子句只會變更子 Cube 中的預設成員。

  • 軸子句中不允許 NON EMPTY 子句;請改用 NonEmpty (MDX) 函數表達式。

  • 軸子句中不允許 HAVING 子句;請改用 Filter (MDX) 函數表示式。

  • 根據預設,子選取中不允許導出成員;不過,您可以藉由將值指派給 ConnectionString 中的 SubQueries 連接字串屬性,或在 支援的 XMLA 屬性 (XMLA)DBPROP_MSMD_SUBQUERIES 屬性,來變更此限制。 如需計算成員行為的詳細說明,請參閱 Subselects 和 Subcubes 中的導出成員,以了解計算成員的行為,視 SubQueriesDBPROP_MSMD_SUBQUERIES的值而定。