现在的位置: 首页 > 综合 > 正文

CUBE用法

2012年08月07日 ⁄ 综合 ⁄ 共 3883字 ⁄ 字号 评论关闭

CUBE
运算符生成的结果集是多维数据集。多维数据集是事实数据(即记录个别事件的数据)的扩展。扩展是基于用户要分析的列建立的。这些列称为维度。多维数据集是结果集,其中包含各维度的所有可能组合的交叉表格。

CUBE
运算符在 SELECT
语句的 GROUP BY
子句中指定。该语句的选择列表包含维度列和聚合函数表达式。GROUP BY
指定了维度列和关键字 WITH CUBE。结果集包含维度列中各值的所有可能组合,以及与这些维度值组合相匹配的基础行中的聚合值。

cube将返回的更多的可能组合。如果在 group by
子句中有n个列或者是有n个表达式的话,sqlserver在结果集上会返回2n1次幂个可能组合。

注意:

使用cube操作符时,最多可以有10个分组表达式

cube中不能使用all关键字

举例(来自MSDN

例如,简单表
Inventory
包含下列数据:

Item                 Color                Quantity                  

-------------------- -------------------- --------------------------
Table                Blue                 124                       
Table                Red                  223                       
Chair                Blue                 101                       
Chair                Red                  210                       

以下查询将返回一个结果集,其中包含
Item

Color
的所有可能组合的
Quantity
小计:

SELECTItem, 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。例如:

SELECTCASE 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
维的多维数据集,即具有任意维数的多维数据集。只有一个维度的多维数据集可用于生成合计,例如:

SELECTCASE 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
语句放入视图中:

CREATEVIEW 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)

抱歉!评论已关闭.