巧用grouping进行分组统计

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博客 ” ,链接:http://blog.itpub.net/21251711/viewspace-1022068/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/21251711/viewspace-1022068/

你可能感兴趣的:(r语言)