`
T240178168
  • 浏览: 362764 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

group by后加rollup子句的用法

阅读更多
group by后带rollup子句的用法(真是丑死人了,接触ORACLE一两年了今天才知道还有这样一个用法),group by后带rollup子句这个子句所产生的功能实在是太高级了,见了就高兴。但学习完后感觉也没什么的,很简单的。

下面按我的理解简单总结一下:

一、如何理解group by后带rollup子句所产生的效果

group by后带rollup子句的功能可以理解为:先按一定的规则产生多种分组,然后按各种分组统计数据(至于统计出的数据是求和还是最大值还是平均值等这就取决于SELECT后的聚合函数)。  www.2cto.com  因此要搞懂group by后带rollup子句的用法主要是搞懂它是如何按一定的规则产生多种分组的。另group by后带rollup子句所返回的结果集,可以理解为各个分组所产生的结果集的并集且没有去掉重复数据。下面举例说明:

1、对比没有带rollup的goup by

例:Group by A ,B

产生的分组种数:1种;

即group by A,B

返回结果集:也就是这一种分组的结果集。

2、带rollup但group by与rollup之间没有任何内容

例1:Group by rollup(A ,B)

产生的分组种数:3种;

第一种:group by A,B

第二种:group by A
  www.2cto.com 
第三种:group by NULL

(说明:本没有group by NULL 的写法,在这里指是为了方便说明,而采用之。含义是:没有分组,也就是所有数据做一个统计。例如聚合函数是SUM的话,那就是对所有满足条件的数据进行求和。此写法的含义下同)

返回结果集:为以上三种分组统计结果集的并集且未去掉重复数据。

例2:Group by rollup(A ,B,C)

产生的分组种数:4种;

第一种:group by A,B,C

第二种:group by A,B

第三种:group by A

第四种:group by NULL

返回结果集:为以上四种分组统计结果集的并集且未去掉重复数据。

3、带rollup但group by与rollup之间还包含有列信息

例1:Group by A , rollup(A ,B)

产生的分组种数:3种;

第一种:group by A,A,B    等价于group by A,B

第二种:group by A,A      等价于group by A

第三种:group by A,NULL  等价于group by A

返回结果集:为以上三种分组统计结果集的并集且未去掉重复数据。

例2:Group by C , rollup(A ,B)

产生的分组种数:3种;

第一种:group by C,A,B   
  www.2cto.com 
第二种:group by C,A     

第三种:group by C,NULL  等价于group by C

返回结果集:为以上三种分组统计结果集的并集且未去掉重复数据。

4、带rollup且rollup子句括号内又使用括号对列进行组合

例1:Group by rollup((A ,B))

产生的分组种数:2种;

第一种:group by A,B

第二种:group by NULL

返回结果集:为以上两种分组统计结果集的并集且未去掉重复数据。

例2:Group by rollup(A ,(B,C))

产生的分组种数:3种;

第一种:group by A,B,C

第二种:group by A
  www.2cto.com 
第三种:group by NULL

返回结果集:为以上三种分组统计结果集的并集且未去掉重复数据。

  注:对这种情况,可以理解为几个列被括号括在一起时,就只能被看成一个整体,分组时不需要再细化。因此也可推断rollup括号内也顶多加到一重括号,加多重了应该没有任何意义(这个推断我没有做验证的哦)。

二、与rollup组合使用的其它几个辅助函数

1、grouping()函数

  必须接受一列且只能接受一列做为其参数。参数列值为空返回1,参数列值非空返回0。

2、grouping_id()函数

  必须接受一列或多列做为其参数。

返回值为按参数排列顺序,依次对各个参数使用grouping()函数,并将结果值依次串成一串二进制数然后再转化为十进制所得到的值。

例如:grouping(A) = 0 ; grouping(B) = 1;

     则:grouping_id(A,B) = (01)2 = 1;

                    grouping_id(B,A) = (10)2 =2;

3、group_id()函数
  www.2cto.com 
  调用时不需要且不能传入任何参数。

返回值为某个特定的分组出现的重复次数(第一大点中的第3种情况中往往会产生重复的分组)。重复次数从0开始,例如某个分组第一次出现则返回值为0,第二次出现时返回值为1,……,第n次出现返回值为n-1。

       注:使用以上三个函数往往是为了过滤掉一部分统计数据,而达到美化统计结果的作用。

三、group by后带rollup子句与group by后带cube子句区别

group by后带rollup子句与group by后带cube子句的唯一区别就是:

带cube子句的group by会产生更多的分组统计数据。cube后的列有多少种组合(注意组合是与顺序无关的)就会有多少种分组。

例:Group by cube(A ,B,C)

产生的分组种数:8种;

第一种:group by A,B,C

第二种:group by A,B

第三种:group by A,C

第四种:group by B,C

第五种:group by C

第六种:group by B

第七种:group by A
  www.2cto.com 
第八种:group by NULL

返回结果集:为以上八种分组统计结果集的并集且未去掉重复数据。

四、group by后带grouping sets子句

   group by后带grouping sets子句效果就是只返回小记记录,即只返回按单个列分组后的统计数据,不返回多个列组合分组的统计数据。

例1:Group by grouping sets(A )

产生的分组种数:1种;

第一种:group by A

返回结果集:即为以上一种分组的统计结果集。

例2:Group by grouping sets(A ,B)

产生的分组种数:2种;

第一种:group by A

第二种:group by B

返回结果集:为以上两种分组统计结果集的并集且未去掉重复数据。

例3:Group by grouping sets (A ,B,C)

产生的分组种数:3种;

第一种:group by A
  www.2cto.com 
第二种:group by B

第三种:group by C

返回结果集:为以上三种分组统计结果集的并集且未去掉重复数据。

select t.city_name,
       decode(t.directline_type,
              null,
              '总数',
              directline_type,
              directline_type),
       sum(t.amount)
from tmp_dl_info t
group by rollup(t.city_name, t.directline_type)
分享到:
评论

相关推荐

    group by 后 使用 rollup 子句 总结.doc

    因此要搞懂group by 后 带 rollup 子句的用法主要是搞懂它是如何按一定的规则产生多种分组的。另group by 后 带 rollup 子句所返回的结果集,可以理解为各个分组所产生的结果集的并集且没有去掉重复数据。下面举例...

    GROUP BY子句(rollup,cube,grouping sets)实例说明

    GROUP BY子句(rollup,cube,grouping sets)实例说明

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

    7.1 基本的GROUP BY用法 171 7.2 HAVING子句 174 7.3 GROUP BY的“新”功能 175 7.4 GROUP BY的CUBE扩展 175 7.5 CUBE的实际应用 179 7.6 通过GROUPING()函数排除空值 185 7.7 用GROUPING()来扩展报告 186 ...

    Microsoft SQL Server 2008技术内幕:T-SQL查询(第二卷)

    1.3.3 步骤3:GROUP BY阶段 1.3.4 步骤4:HAVING阶段 1.3.5 步骤5:SELECT阶段 1.3.6 步骤6:排序用的ORDER BY阶段 1.4 逻辑查询处理的深入内容 1.4.1 表运算符 1.4.2 OVER子句 1.4.3 集合运算符 1.5 总结 ...

    SQLServer2008技术内幕T-SQL查询包含源代码及附录A

    1.3.3 步骤3:GROUP BY阶段10 1.3.4 步骤4:HAVING阶段11 1.3.5 步骤5:SELECT阶段12 1.3.6 步骤6:排序用的ORDER BY阶段13 1.4 逻辑查询处理的深入内容16 1.4.1 表运算符16 1.4.2 OVER子句23 1.4.3 集合运算符25 ...

    Microsoft+SQL+Server+2008技术内幕:T-SQL查询_源代码及附录 中文版

    1.3.3 步骤3:GROUP BY阶段10 1.3.4 步骤4:HAVING阶段11 1.3.5 步骤5:SELECT阶段12 1.3.6 步骤6:排序用的ORDER BY阶段13 1.4 逻辑查询处理的深入内容16 1.4.1 表运算符16 1.4.2 OVER子句23 1.4.3 集合...

    Oracle_Database_11g完全参考手册.part3/3

    12.1 groupby和having的用法 12.1.1 添加一个orderby 12.1.2 执行顺序 12.2 分组视图 12.3 用别名重命名列 12.4 分组视图的功能 12.4.3 对列和分组函数进行排序 12.4.4 连接列 12.5 更多分组可能性 第13章 当一个...

    Oracle_Database_11g完全参考手册.part2/3

    12.1 groupby和having的用法 12.1.1 添加一个orderby 12.1.2 执行顺序 12.2 分组视图 12.3 用别名重命名列 12.4 分组视图的功能 12.4.3 对列和分组函数进行排序 12.4.4 连接列 12.5 更多分组可能性 第13章 当一个...

    精通Oracle.10g.PLSQL编程

    使用SQL语句 4.1 使用基本查询 4.1.1 简单查询语句 4.1.2 使用WHERE子句 4.1.3 使用ORDERBY子句 4.2 使用DML语句 4.2.1 插入数据 4.2.2 更新数据 4.2.3 删除数据 4.3 ...

    Oracle事例

    20.oracle8中扩充了group by rollup和cube的操作。有时候省了你好多功夫的。 下面的语句可以进行总计 select region_code,count(*) from aicbs.acc_woff_notify group by rollup(region_code); <2> 对第1个字段...

Global site tag (gtag.js) - Google Analytics