今天接触Cgroup by后带rollup子句的用法(真是丑死ZQ接触ORACLE一两年了今天才知道q有q样一个用法)Qgroup by后带rollup子句q个子句所产生的功能实在是太高U了Q见了就高兴。但学习完后感觉也没什么的Q很单的?/p>
下面按我的理解简单ȝ一下:
一、如何理解group by?/strong>带rollup子句所产生的效?/strong>
group by后带rollup子句的功能可以理解ؓQ先按一定的规则产生多种分组Q然后按各种分组l计数据Q至于统计出的数据是求和q是最大D是^均值等q就取决于SELECT后的聚合函数Q。因此要搞懂group by后带rollup子句的用?strong>主要是搞懂它是如何按一定的规则产生多种分组?/strong>?strong>?/strong>group by?/strong>带rollup子句所q回的结果集Q可以理解ؓ各个分组所产生的结果集的ƈ集且没有L重复数据。下面D例说明:
1?/span>Ҏ没有带rollup的goup by
例:Group by A ,B
产生的分l种敎ͼ1U;
即group by A,B
q回l果集:也就是这一U分l的l果集?/p>
2?/span>带rollup但group by与rollup之间没有M内容
?QGroup by rollup(A ,B)
产生的分l种敎ͼ3U;
W一U:group by A,B
W二U:group by A
W三U:group by NULL
Q说明:本没?/span>group by NULL 的写法,在这里指是ؓ了方便说明,而采用之。含义是Q没有分l,也就是所有数据做一个统计。例如聚合函数是SUM的话Q那是Ҏ有满x件的数据q行求和。此写法的含义下?/span>)
q回l果集:Z上三U分l统计结果集的ƈ集且未去掉重复数据?/p>
?QGroup by rollup(A ,B,C)
产生的分l种敎ͼ4U;
W一U:group by A,B,C
W二U:group by A,B
W三U:group by A
W四U:group by NULL
q回l果集:Z上四U分l统计结果集的ƈ集且未去掉重复数据?/p>
3?/span>带rollup但group by与rollup之间q包含有列信?/strong>
?QGroup by A , rollup(A ,B)
产生的分l种敎ͼ3U;
W一U:group by A,A,B {h于group by A,B
W二U:group by A,A {h于group by A
W三U:group by A,NULL {h于group by A
q回l果集:Z上三U分l统计结果集的ƈ集且未去掉重复数据?/p>
?QGroup by C , rollup(A ,B)
产生的分l种敎ͼ3U;
W一U:group by C,A,B
W二U:group by C,A
W三U:group by C,NULL {h于group by C
q回l果集:Z上三U分l统计结果集的ƈ集且未去掉重复数据?/p>
4?/span>带rollup且rollup子句括号内又使用括号对列q行l合
?QGroup by rollup((A ,B))
产生的分l种敎ͼ2U;
W一U:group by A,B
W二U:group by NULL
q回l果集:Z上两U分l统计结果集的ƈ集且未去掉重复数据?/p>
?QGroup by rollup(A ,(B,C))
产生的分l种敎ͼ3U;
W一U:group by A,B,C
W二U:group by A
W三U:group by NULL
q回l果集:Z上三U分l统计结果集的ƈ集且未去掉重复数据?/p>
注:对这U情况,可以理解为几个列被括h在一hQ就只能被看成一个整体,分组时不需要再l化。因此也可推?/span>rollup括号内也多加到一重括P加多重了应该没有M意义Q这个推断我没有做验证的哦)?/span>
二、与rollupl合使用的其它几个辅助函?/strong>
1、grouping()函数
必须接受一列且只能接受一列做为其参数。参数列gؓI?Q参数列值非I??/p>
2、grouping_id()函数
必须接受一列或多列做ؓ其参数?/p>
q回gؓ按参数排列顺序,依次对各个参C用grouping()函数Qƈ结果gơ串成一串二q制数然后再转化为十q制所得到的倹{?/p>
例如Qgrouping(A) = 0 ; grouping(B) = 1;
则:grouping_id(A,B) = (01)2 = 1;
grouping_id(B,A) = (10)2 =2;
3、group_id()函数
调用时不需要且不能传入M参数?/p>
q回gؓ某个特定的分l出现的重复ơ数(W一大点中的W?U情况中往往会生重复的分组)。重复次C0开始,例如某个分组W一ơ出现则q回gؓ0Q第二次出现时返回gؓ1Q?#8230;…Q第nơ出现返回gؓn-1?/p>
注:使用以上三个函数往往是ؓ了过滤掉一部分l计数据Q而达到美化统计结果的作用?/span>
三、group by后带rollup子句与group by后带cube子句区别
group by后带rollup子句与group by后带cube子句的唯一区别是Q?/p>
带cube子句的group by会生更多的分组l计数据。cube后的列有多少U组合(注意l合是与序无关的)׃有多种分组?/p>
例:Group by cube(A ,B,C)
产生的分l种敎ͼ8U;
W一U:group by A,B,C
W二U:group by A,B
W三U:group by A,C
W四U:group by B,C
W五U:group by C
W六U:group by B
W七U:group by A
W八U:group by NULL
q回l果集:Z上八U分l统计结果集的ƈ集且未去掉重复数据?/p>
四、group by后带grouping sets子句
group by后带grouping sets子句效果是只返回小记记录,卛_q回按单个列分组后的l计数据Q不q回多个列组合分l的l计数据?/p>
?QGroup by grouping sets(A )
产生的分l种敎ͼ1U;
W一U:group by A
q回l果集:即ؓ以上一U分l的l计l果集?/p>
?QGroup by grouping sets(A ,B)
产生的分l种敎ͼ2U;
W一U:group by A
W二U:group by B
q回l果集:Z上两U分l统计结果集的ƈ集且未去掉重复数据?/p>
?QGroup by grouping sets (A ,B,C)
产生的分l种敎ͼ3U;
W一U:group by A
W二U:group by B
W三U:group by C
q回l果集:Z上三U分l统计结果集的ƈ集且未去掉重复数据?/p>
select t.city_name,
decode(t.directline_type,
null,
'L',
directline_type,
directline_type),
sum(t.amount)
from tmp_dl_info t
group by rollup(t.city_name, t.directline_type)