CUBE 運算符生成的結果集是多維數據集。多維數據集是事實數據(即記錄個別事件的數據)的擴展。擴展是基於用戶要分析的列建立的。這些列稱爲維度。多維數據集是結果集,其中包含各維度的所有可能組合的交叉表格。
CUBE 運算符在 SELECT 語句的 GROUP BY 子句中指定。該語句的選擇列表包含維度列和聚合函數表達式。GROUP BY 指定了維度列和關鍵字 WITH CUBE。結果集包含維度列中各值的所有可能組合,以及與這些維度值組合相匹配的基礎行中的聚合值。
cube將返回的更多的可能組合。如果在 group by 子句中有n個列或者是有n個表達式的話,sqlserver在結果集上會返回2的n-1次冪個可能組合。
注意:
使用cube操作符時,最多可以有10個分組表達式
在cube中不能使用all關鍵字
舉例(來自MSDN)
例如,簡單表 Inventory 包含下列數據:
Item Color Quantity -------------------- -------------------- -------------------------- Table Blue 124 Table Red 223 Chair Blue 101 Chair Red 210
以下查詢將返回一個結果集,其中包含 Item
和 Color
的所有可能組合的 Quantity
小計:
SELECT Item, Color, SUM(Quantity) AS QtySum FROM Inventory GROUP BY Item, Color WITH CUBE
下面是結果集:
Item Color QtySum -------------------- -------------------- -------------------------- Chair Blue 101.00 Chair Red 210.00 Chair (null) 311.00 Table Blue 124.00 Table Red 223.00 Table (null) 347.00 (null) (null) 658.00 (null) Blue 225.00 (null) Red 433.00
我們着重考查結果集中的以下幾行:
Chair (null) 311.00
此行報告了在 Item
維度中包含 Chair
值的所有行的小計。對 Color
維度返回了
null
值,用以表示該行報告的聚合包括 Color
維度爲任意值的行。
Table (null) 347.00
這一行類似,但報告的是 Item
維度中包含 Table
值的所有行的小計。
(null) (null) 658.00
這一行報告了多維數據集的總計。Item
和 Color
維度都包含 null
值。這表示此行中彙總了這兩個維度的所有值。
(null) Blue 225.00 (null) Red 433.00
這兩行報告了 Color
維度的小計。兩行中的 Item
維度值都是 null
,表示聚合數據來自
Item
維度爲任意值的行。
使用 GROUPING 區分空值
CUBE 操作生成空值將會帶來一個問題:如何區分 CUBE 操作生成的 NULL 值和在實際數據中返回的 NULL 值?可以使用 GROUPING 函數解決此問題。如果列值來自事實數據,GROUPING 函數將返回 0;如果列值是由 CUBE 操作生成的 NULL,則返回 1。在 CUBE 操作中,生成的 NULL 代表所有值。可以編寫 SELECT 語句以使用 GROUPING 函數將生成的任一 NULL 替換爲字符串 ALL。由於事實數據中的 NULL 表示數據值未知,因此也可以將 SELECT 編碼爲返回字符串 UNKNOWN,用於表示事實數據中的 NULL。例如:
SELECT CASE WHEN (GROUPING(Item) = 1) THEN 'ALL' ELSE ISNULL(Item, 'UNKNOWN') END AS Item, CASE WHEN (GROUPING(Color) = 1) THEN 'ALL' ELSE ISNULL(Color, 'UNKNOWN') END AS Color, SUM(Quantity) AS QtySum FROM Inventory GROUP BY Item, Color WITH CUBE
多維數據集
CUBE 運算符可用於生成 n 維的多維數據集,即具有任意維數的多維數據集。只有一個維度的多維數據集可用於生成合計,例如:
SELECT CASE WHEN (GROUPING(Item) = 1) THEN 'ALL' ELSE ISNULL(Item, 'UNKNOWN') END AS Item, SUM(Quantity) AS QtySum FROM Inventory GROUP BY Item WITH CUBE GO
此 SELECT
語句返回的結果集既顯示了 Item
中每個值的小計,也顯示了 Item
中所有值的總計:
Item QtySum -------------------- -------------------------- Chair 311.00 Table 347.00 ALL 658.00
包含具有多個維度的 CUBE 的 SELECT 語句可生成大型結果集,因爲這些語句會爲所有維度中各值的所有組合都生成相應的行。這些大型結果集包含的數據可能會過多而不易於閱讀和理解。此問題的一種解決辦法是將
SELECT
語句放入視圖中:
CREATE VIEW InvCube AS SELECT CASE WHEN (GROUPING(Item) = 1) THEN 'ALL' ELSE ISNULL(Item, 'UNKNOWN') END AS Item, CASE WHEN (GROUPING(Color) = 1) THEN 'ALL' ELSE ISNULL(Color, 'UNKNOWN') END AS Color, SUM(Quantity) AS QtySum FROM Inventory GROUP BY Item, Color WITH CUBE
然後即可用該視圖來僅查詢您感興趣的維度值:
SELECT * FROM InvCube WHERE Item = 'Chair' AND Color = 'ALL' Item Color QtySum -------------------- -------------------- -------------------------- Chair ALL 311.00 (1 row(s) affected)