开通VIP,畅享免费电子书等14项超值服
首页
好书
留言交流
下载APP
联系客服
2013.10.30
SQL> select emp_id,month,prd_type_id,amount2 from all_sales3 where emp_id=214 order by emp_id,month ;
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_sales3 where emp_id=214 group by emp_id,month5 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 进行分组
SQL> select emp_id,month,sum(amount)2 from all_sales3 where emp_id=214 group by rollup(emp_id,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 21 466997.84 466997.84
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_sales3 group by rollup(emp_id,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 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_SALES5 GROUP BY ROLLUP(EMP_ID, MONTH)6 ; EMP_ID ND SUM(AMOUNT)---------------------------------------- ---------------------------------------- -----------21 1 20139.3621 2 21578.621 3 30251.3221 12 36139.3621 员工年度 466997.8426 7 12549.3626 8 23139.2826 9 19318.2826 10 26116.9926 11 14821.3826 12 15639.3726 员工年度 228769.93所有员工 所有员工年度 1972485.13
微信登录中...请勿关闭此页面