ITPub博客

首页 > 数据库 > Oracle > 巧用grouping进行分组统计

巧用grouping进行分组统计

原创 Oracle 作者:pwz1688 时间:2009-05-14 10:30:05 0 删除 编辑
grouping以前有遇到过,但不太记得,今天又在论坛刚到一则贴子,巧妙的运用了grouping进行分组统计与小计,下面记录如下:[@more@]

例表数据如下:

ID NAME GRADE
1 a 10
1 a 15
1 b 5
1 b 10
1 c 20
2 a 5
.....

要求的结果是:对id,name分组合计,再对id求小计,要求小计时只对name 是a,b求和,不用UNION怎么写sql语句?
结果集:
ID NAME SUM(GRADE)
1 a 25
1 b 15
1 c 20
1 小计 40 --ID=1时 name 是a,b的和计

解决方法:

SQL> select * from tmp;

ID NA GRADE
---------- -- ----------
1 a 10
1 a 15
1 b 5
1 b 10
1 c 20
2 a 5

已选择6行。

SQL> select id,
2 decode(grouping(name),1,'小计',name) name,
3 decode(grouping(name),1,sum(decode(name,'a',grade,'b',grade,0)),sum(grade))
sum_grade
4 from tmp
5 group by grouping sets((id,name),(id));

ID NAME SUM_GRADE
---------- ---- ----------
1 a 25
1 b 15
1 c 20
1 小计 40
2 a 5
2 小计 5

已选择6行。

SQL> select id,
2 decode(grouping(name),1,'小计',name) name,
3 sum(grade)
4 from tmp
5 group by grouping sets((id,name),(id));

ID NAME SUM(GRADE)
---------- ---- ----------
1 a 25
1 b 15
1 c 20
1 小计 60
2 a 5
2 小计 5

已选择6行。

SQL> select * from tmp;

ID NA GRADE
---------- -- ----------
1 a 10
1 a 15
1 b 5
1 b 10
1 c 20
2 a 5

已选择6行。

SQL> select id,decode(grouping(name),1,'小计',name) name,
2 sum(grade)
3 from tmp
4 group by rollup(id,name);

ID NAME SUM(GRADE)
---------- ---- ----------
1 a 25
1 b 15
1 c 20
1 小计 60
2 a 5
2 小计 5
小计 65

已选择7行。

SQL>

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/21251711/viewspace-1022068/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-03-30

  • 博文量
    106
  • 访问量
    736042