`
cui09
  • 浏览: 113729 次
  • 性别: Icon_minigender_1
  • 来自: 吉林
最近访客 更多访客>>
社区版块
存档分类
最新评论

关于group by的深入理解(扩展到rollup,增强groupby,主要用于小计)

阅读更多

当我们选不只一个栏位,且其中至少一个栏位有包含函数的运用时,我们就要用到group by这个指令。在这个情况下。
我们需要确定我们有group by所有其他的栏位。换句话说。除了包括函数的栏位外。我们都要将其放在group by子名。

msdn中这样解释:

指定用来放置输出行的组。如果 SELECT 子句 <select list> 中包含聚合函数,则 GROUP BY 将计算每组的汇总值。指定 GROUP BY 时,选择列表中任意非聚合表达式内的所有列都应包含在 GROUP BY 列表中,或者 GROUP BY 表达式必须与选择列表表达式完全匹配。

使用 ROLLUP 汇总数据 

在生成包含小计和合计的报表时,ROLLUP 运算符很有用。ROLLUP 运算符生成的结果集类似于 CUBE 运算符生成的结果集。


使用 ROLLUP 汇总数据 

在生成包含小计和合计的报表时,ROLLUP 运算符很有用。ROLLUP 运算符生成的结果集类似于 CUBE 运算符生成的结果集。有关详细信息,请参阅使用 CUBE 汇总数据。

下面是 CUBE 和 ROLLUP 之间的具体区别:

CUBE 生成的结果集显示了所选列中值的所有组合的聚合。

ROLLUP 生成的结果集显示了所选列中值的某一层次结构的聚合。

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

Item                 Color                Quantity                  
-------------------- -------------------- --------------------------
Table                Blue                 124                       
Table                Red                  223                       
Chair                Blue                 101                       
Chair                Red                  210                       

以下查询将生成小计报表:

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 ROLLUP

Item                 Color                QtySum                    
-------------------- -------------------- --------------------------
Chair                Blue                 101.00                    
Chair                Red                  210.00                    
Chair                ALL                  311.00                    
Table                Blue                 124.00                    
Table                Red                  223.00                    
Table                ALL                  347.00                    
ALL                  ALL                  658.00                    

(7 row(s) affected)

如果将查询中的 ROLLUP 关键字更改为 CUBE,那么 CUBE 结果集保持不变,只是在末尾还会返回下列两行:

ALL                  Blue                 225.00                    
ALL                  Red                  433.00                    

CUBE 操作为 Item 和 Color 中值的可能组合生成行。例如,CUBE 不仅报告 Color 值与 Item 值 Chair(Red、Blue 和 Red + Blue)的所有可能组合,还报告 Item 值与 Color 值 Red(Chair、Table 和 Chair + Table)的所有可能组合。

对于 GROUP BY 子句的右列中的每个值,ROLLUP 操作并不报告左列中各值的所有可能组合。例如,ROLLUP 并不报告每个 Color 值的 Item 值的所有可能组合。

ROLLUP 操作的结果集与 COMPUTE BY 返回的结果集具有类似的功能。然而,ROLLUP 具有下列优点:

ROLLUP 返回单个结果集,而 COMPUTE BY 返回多个结果集,而多个结果集会增加应用程序代码的复杂性。

ROLLUP 可以在服务器游标中使用,而 COMPUTE BY 则不可以。

有时,查询优化器为 ROLLUP 生成的执行计划比为 COMPUTE BY 生成的更为高效。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics