使用 CUBE 來摘要資料

CUBE 運算子會產生多維度 Cube 的結果集。多維度 Cube 是事實資料的擴充,或是記錄個別事件的資料。這種擴充以使用者所要分析的資料行為基礎,而這些資料行稱為維度。Cube 是一個結果集,其中包含維度的所有可能組合的交叉列表。

CUBE 運算子是在 SELECT 陳述式的 GROUP BY 子句中指定。選取清單中包含維度資料行與彙總函數運算式。GROUP BY 可指定維度資料行與關鍵字 WITH CUBE。結果集包含維度資料行值的所有可能組合,以及符合維度值組合之基礎資料列的彙總值。

例如,一個簡單的 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                     

此資料列報告了 Cube 的總計。ItemColor 維度都有 null 值。這顯示這兩個維度的所有值都摘要於資料列中。

(null)               Blue                 225.00                     
(null)               Red                  433.00                     

這兩個資料列報告了 Color 維度的小計。這兩者的 Item 維度均為 null 值,顯示出彙總資料來自具有任何 Item 維度值的資料列。

使用 GROUPING 來區分 Null 值

CUBE 作業所產生的 null 值會出現問題:如何區分 CUBE 作業所產生的 NULL 與實際資料中傳回的 NULL?答案是使用 GROUPING 函數來區分。如果此資料行值來自事實資料,GROUPING 函數會傳回 0,如果資料行值為 CUBE 作業所產生 的 NULL,則傳回 1。在 CUBE 作業中,產生的 NULL 表示所有值。您可以撰寫 SELECT 陳述式來使用 GROUPING 函數,以將字串 ALL 取代任何產生的 NULL。因為來自事實資料的 NULL 表示資料值未知,您也可以將 SELECT 編碼,對來自事實資料的任何 NULL 值,傳回字串 UNKNOWN。例如:

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

CUBE 運算子可用來產生 n-維度的 Cube,或是具有任何維度數值的 Cube。單一維度的 Cube 可用來產生總計,例如:

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)

請參閱

概念

使用 ROLLUP 來摘要資料

其他資源

SELECT (Transact-SQL)

說明及資訊

取得 SQL Server 2005 協助