SQL> select emp_id,month,prd_type_id,amount
2 from all_sales
3 where emp_id=21
4 order by emp_id,month ;html
EMP_ID MONTH PRD_TYPE_ID AMOUNT
---------- ---------- ----------- ----------
21 1 4 3034.84
21 1 3 6034.84
21 1 2 1034.84
21 1 5
21 1 1 10034.84
21 2 3 1944.65
21 2 4 2944.65
21 2 1 15144.65
注:表中数据太多,只显示了一部分。
表all_sales存放2003年每一个员工每一个产品每一个月的销量,
SQL> select emp_id,month,sum(amount)
2 from all_sales
3 where emp_id=21
4 group by emp_id,month
5 order by month ;函数
EMP_ID MONTH SUM(AMOUNT)
---------- ---------- -----------
21 1 20139.36
21 2 21578.6
21 3 30251.32
21 4 35729.8
21 5 25358.24
21 6 28258.56
21 7 36449.36
21 8 62639.28
21 9 49418.28
21 10 80016.76
21 11 41018.92
21 12 36139.36
用ROLLUP 进行分组spa
SQL> select emp_id,month,sum(amount)
2 from all_sales
3 where emp_id=21
4 group by rollup(emp_id,month) ;htm
EMP_ID MONTH SUM(AMOUNT)
---------- ---------- -----------
21 1 20139.36
21 2 21578.6
21 3 30251.32
21 4 35729.8
21 5 25358.24
21 6 28258.56
21 7 36449.36
21 8 62639.28
21 9 49418.28
21 10 80016.76
21 11 41018.92
21 12 36139.36
21 466997.84
466997.84blog
ROLLUP(emp_id,month):先对每一个EMP_id的每一个月的销量
进行分组求和,至关于GROUP BY EMP_ID,MONTH,得出这个员工,
每一个月的销量总和,而后求这个员工一年全部的销量,至关于
GROUP BY EMP_ID,最后所求全部员工的销量总和,
由于查询限制只返回EMP_ID=21的数据,因此
最后两条记录的值相同。
group by rollup(emp_id,month) 与group by emp_id,month
不一样之处在因而,group by rollup(emp_id,month) 求得每一个员工的
月销量以后,又多作了两个工做,一是求得每一个员一年全部的销量,
二是求全部员工的年总销量。
若是除去where emp_id=21,则最后一条记录返回全部员工的总销量,如:
SQL> select emp_id,month,sum(amount)
2 from all_sales
3 group by rollup(emp_id,month) ;get
EMP_ID MONTH SUM(AMOUNT)
---------- ---------- -----------
21 1 20139.36
21 2 21578.6
21 3 30251.32
21 4 35729.8
21 5 25358.24
21 6 28258.56
21 7 36449.36
21 8 62639.28
21 9 49418.28
21 10 80016.76
21 11 41018.92
21 12 36139.36
21 466997.84
22 1 21939.36
22 2 21078.6
23 6 15658.56
23 7 33649.3
23 11 30518.92
23 12 24139.36
23 323077.84
24 1 14669.36
24 2 28878.6
24 3 35651.32
24 10 30116.76
24 11 22621.92
24 12 24139.36
24 333370.84
25 1 7269.36
25 2 13678.6
25 11 12821.92
25 12 12639.36
25 187970.84
26 1 16568.75
26 11 14821.38
26 12 15639.37
26 228769.93
1972485.13
数据太多,只显示一部分。
能够看出,group by rollup(emp_id,month) 为每一个员工的销量进行了
汇总,得出了月销量和年销量(每一个员工的最后一条),同时为全部员工进行了汇总,得出全部
员工的年总销量(最后一条记录)产品
函数:grouping
接收列做为参数,若是列为空,则grouping返回1,不然返回0,该函数与rollup搭配使用。
能够使用grouping函数对上述查询进行处理。
SQL> SELECT DECODE(GROUPING(EMP_ID), 1, '全部员工', EMP_ID) EMP_ID,
2 nvl2(emp_id,DECODE(GROUPING(MONTH), 1, '员工年度', MONTH),'全部员工年度') ND,
3 SUM(AMOUNT)
4 FROM ALL_SALES
5 GROUP BY ROLLUP(EMP_ID, MONTH)
6 ;
EMP_ID ND SUM(AMOUNT)
---------------------------------------- ---------------------------------------- -----------
21 1 20139.36
21 2 21578.6
21 3 30251.32
21 12 36139.36
21 员工年度 466997.84
26 7 12549.36
26 8 23139.28
26 9 19318.28
26 10 26116.99
26 11 14821.38
26 12 15639.37
26 员工年度 228769.93
全部员工 全部员工年度 1972485.13it