oracle sql 汇总求和
--本文的例子全部在oracle中实现,sql server的实现方法请参照sql server的帮助文档。
/*
oracle 中提供了sum,求和函数搭配rollup和cube可以满足大量格式的求和(sql server中也有这些函数
,用法上面有些小的区别).在前面的文章中也讲过了rollup和cube的使用方法和实现原理.
我们仍沿用上一篇文章<sql 行列互换>创建的表.先看看cube函数计算出数据的格式
*/
select name,kecheng,sum(chengji)
from fzq
group by cube (name,kecheng)
order by name,kecheng
/* 显示结果如下:
NAME KECHENG SUM(CHENGJI)
---------- -------------------- ----------------------
a 数学 70
a 语文 80
a 150
b 数学 100
b 语文 40
b 140
c 数学 92
c 语文 90
c 182
数学 262
语文 210
472
12 rows selected
*/
/*
先看看另类实现方式的结果:
NAME KECHENG CHENGJI
---------- ------------------------- ----------------------
a 数学 70
a 语文 80
a 总成绩: 150
b 数学 100
b 语文 40
b 总成绩: 140
c 数学 92
c 语文 90
c 总成绩: 182
数学合计: 262
语文合计: 210
全班总成绩: 472
12 rows selected
这个实现方法就上在课程中增加了总成绩,数学合计,语文合计,全班总成绩.整体上感觉比较舒服.
下面是实现脚本.
注意:to_number(chengji)为什么加to_number函数.这是因为union,union要求合并的查询结果
必须要求个数和数据类型一致.而在建表的时候将成绩字段设置成了varchar类型了.而下边的sum(chengji)
会自动转换成数字形式.所以必须使用to_number函数转换一下.
增加'11' id 这列的目的就是和name,kecheng一起排序,如果不按照order by name,id,kecheng
这个顺序排序,那么显示结果就会有差别.
*/
select name,kecheng,chengji
from
(
select '11' id ,name,kecheng,to_number(chengji) as chengji
from fzq
union
select '22' id, name, '总成绩:',sum(chengji)
from fzq
group by name
union
select '33' id,'',kecheng || '合计:',sum(chengji)
from fzq
group by kecheng
union
select '44' id,'','全班总成绩:',sum(chengji)
from fzq
) aa
order by name,id,kecheng
--如果还有其他好方法,拿出来大家共同分享.