为什么 group by 子句中,一般不建议使用 CUBE、ROLLUP 子句呢?
--------------------------------------------
这两个子句都可以实现小计的合计行的功能,但是一些资料上却说,最好不用,我不知为什么,
一定有一些道理吧,请大家解惑。

解决方案 »

  1.   

    CUBE ROLLUP GROUPING SETS对SQL的扩展使得查询和报告都变得简单和迅速。
    Rollup计算诸如sum count max min avg的函数,增加了聚合的级别.CUBE是一个类似ROLLUP的扩展,使得可以用一个语句计算所有可能的聚合。
    CUBE可以通过单条生成Cross-tabulation(交叉报表)报告的信息。
    CUBE,ROLLUP,GROUPING SETS扩展令你可以精确的对你感兴趣的group by 条款进行grouping。不运行cube操作也可以高效的从多个维度进行分析。
    计算一个full cube将会带来很高的负载.
      

  2.   

    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 语句可能生成很大的结果集,因为这些语句会为所有维度中值的所有组合生成行。这些大结果集包含的数据可能过多而不易于阅读和理解。rollip 我个人觉得挺好的。
    主要还是看需求吧