例表数据如下:
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/