轉自 http://www.cnblogs.com/dyufei/archive/2009/11/11/2573975.htmlhtml
CUBE 運算符生成的結果集是多維數據集。多維數據集是事實數據(即記錄個別事件的數據)的擴展。擴展是基於用戶要分析的列創建的。這些列稱爲維度。多維數據集是結果集,其中包含各維度的全部可能組合的交叉表格。sql
CUBE 運算符在 SELECT 語句的 GROUP BY 子句中指定。該語句的選擇列表包含維度列和聚合函數表達式。GROUP BY 指定了維度列和關鍵字 WITH CUBE。結果集包含維度列中各值的全部可能組合,以及與這些維度值組合相匹配的基礎行中的聚合值。函數
cube將返回的更多的可能組合。若是在 group by 子句中有n個列或者是有n個表達式的話,sqlserver在結果集上會返回2的n-1次冪個可能組合。sqlserver
使用cube操做符時,最多能夠有10個分組表達式編碼
在cube中不能使用all關鍵字code
例如,簡單表 Inventory 包含下列數據:server
Item Color Quantity -------------------- -------------------- -------------------------- Table Blue 124 Table Red 223 Chair Blue 101 Chair Red 210
如下查詢將返回一個結果集,其中包含 Item
和 Color
的全部可能組合的 Quantity
小計:htm
SELECT Item, Color, SUM(Quantity) AS QtySum FROM Inventory GROUP BY Item, Color WITH CUBE
下面是結果集:blog
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
維度爲任意值的行。
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)