zoukankan      html  css  js  c++  java
  • 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)
  • 相关阅读:
    【漏洞分析】DDOS攻防分析(二)——HTTP篇
    【漏洞分析】DDOS攻防分析(四)——TCP篇
    [spring]spring框架的编码过滤器的使用
    [struts]s:action 的使用方法
    [maven]使用maven构建Appfuse失败
    [网站安全]windows本地安全策略阻止指定ip访问本机
    [前端]quirks模式(怪异模式)
    [前端]客户端缓存
    [struts]在线编辑器的使用选择
    [eclipse]Myeclipse console 中乱码问题
  • 原文地址:https://www.cnblogs.com/dyufei/p/2573975.html
Copyright © 2011-2022 走看看