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>