自己写好记的Oracle的 Group By 、 Group By Rollup和Group By Cube基础
在ASP.NET的开发中不免得要和数据库打交道,而Oracle是不能不掌握的。(我就吃了学校的亏,在学校上学的时候都不知道Oracle长什么样)
在统计的时候Group By 、 Group By Rollup和Group By Cube这三个是最长用的,但是对于初学者来说搞清它们有点难度,所以我把我的认识过程记下来,希望对有同样苦恼的人有所帮助。
1.Group By
描述
用途 :只用于数据分组而不用于数据排序
例:表table
ID |
NUM |
1 |
22 |
1 |
23 |
2 |
22 |
SELECT ID,NUM FROM table GROUP BY NUM 报错,因为ID没有分组
SELECT COUNT(ID),NUM FROM table GROUP BY ID报错,因为NUM没有分组
SELECT COUNT(ID),ID FROM table GROUP BY ID
COUNT(ID) |
ID |
2 |
1 |
1 |
2 |
SELECT COUNT(ID),NUM FROM table GROUP BY NUM
COUNT(ID) |
NUM |
2 |
22 |
1 |
23 |
2.Group By Rollup
描述:依据分组对数据进行统计,用于求和或计数
理解:在GROUPING_ID(条件1,条件2)中有两个条件,ROLLUP对条件1情有独钟,分组时按照 (条件1 ,条件2),条件1,没条件 这三个顺序分组,ROLLUP的返回值分别为(0,0)、(0,1)和(1,1) 。以此为二进制算出GROUP BY ROLLUP 的返回值 0、1、3(当然了这只是两个条件,三个条件时为(条件1,条件2,条件3)、(条件1,条件2)、条件1、没条件 三个以上以此类推)
例:
GROUP |
NUM |
001 |
23 |
001 |
22 |
002 |
23 |
002 |
22 |
SELECT GROUP,NUM,GROUPING_ID(GROUP,NUM) ROLLUP,COUNT(GROUP) FROM table GROUP BY ROLLUP(GROUP,NUM) ORDER BY ROLLUP,GROUP
结果:
GROUP |
NUM |
ROLLUP |
COUNT(NUM) |
001 |
23 |
0 |
1 |
001 |
22 |
0 |
1 |
002 |
23 |
0 |
1 |
002 |
22 |
0 |
1 |
001 |
|
1 |
2 |
002 |
|
1 |
2 |
|
|
3 |
4 |
如果GROUPING_ID中的条件互换位置,结果不同:
GROUP |
NUM |
ROLLUP |
COUNT(NUM) |
001 |
23 |
0 |
1 |
001 |
22 |
0 |
1 |
002 |
23 |
0 |
1 |
002 |
22 |
0 |
1 |
|
23 |
1 |
2 |
|
22 |
1 |
2 |
|
|
3 |
4 |
3.Group By Cube
描述:依据分组对数据进行统计,用于求和或计数
理解:在GROUPING_ID(条件1,条件2)中有两个条件,CUBE则充分体现分组的公平性,分组时按照 (条件1 ,条件2),条件1,条件2,没条件 这四个顺序分组,CUBE的返回值分别为(0,0)、(0,1)、(1,0)和(1,1) 。依次返回GROUP BY CUBE 的值为0、1、2、3(当然了这只是两个条件,三个条件时为(条件1,条件2,条件3)、(条件1,条件2)、(条件1,条件3)、条件1、(条件2,条件3)、条件2、条件3、没条件 三个以上以此类推)
例:
GROUP |
NUM |
001 |
23 |
001 |
22 |
002 |
23 |
002 |
22 |
SELECT GROUP,NUM,GROUPING_ID(GROUP,NUM) CUBE,COUNT(GROUP) FROM table GROUP BY ROLLUP(GROUP,NUM) ORDER BY CUBE,GROUP
结果:
GROUP |
NUM |
CUBE |
COUNT(NUM) |
001 |
23 |
0 |
1 |
001 |
22 |
0 |
1 |
002 |
23 |
0 |
1 |
002 |
22 |
0 |
1 |
001 |
|
1 |
2 |
002 |
|
1 |
2 |
|
23 |
2 |
2 |
|
22 |
2 |
2 |
|
|
3 |
4 |
如果GROUPING_ID中的条件互换位置,结果不同:
GROUP |
NUM |
CUBE |
COUNT(NUM) |
001 |
23 |
0 |
1 |
001 |
22 |
0 |
1 |
002 |
23 |
0 |
1 |
002 |
22 |
0 |
1 |
|
23 |
1 |
2 |
|
22 |
1 |
2 |
001 |
|
2 |
2 |
002 |
|
2 |
2 |
|
|
3 |
4 |