SQL中CUBE 用法

轉自 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

舉例(來自MSDN

例如,簡單表 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 維度爲任意值的行。

  使用 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)
相關文章
相關標籤/搜索