SQL中CUBE 用法

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                        

以下查詢將返回一個結果集,其中包含 ItemColor 的所有可能組合的 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                     

這一行報告了多維數據集的總計。ItemColor 維度都包含 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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章