假设有张学生成绩表(CJ)如下
[姓名] [学科] [成绩]
张三 语文 80
张三 数学 86
张三 英语 75
李四 语文 78
李四 数学 85
李四 英语 78 要显示成如下结果:姓名 语文 数学 英语 总成绩
---------- ---------- ---------- ---------- ----------
李四 78 85 78 241
张三 80 86 75 241
总分 158 171 153 482
如何实现?我现在弄成这样姓名 语文 数学 英语 总成绩
---------- ---------- ---------- ---------- ----------
李四 78 85 78 241
张三 80 86 75 241对应SQL为:select name as 姓名,sum(case xk when '语文' then chengji end) as 语文,
sum(case xk when '数学' then chengji end) as 数学,
sum(case xk when '英语' then chengji end) as 英语,
sum(chengji) as 总成绩 from cj group by name;不知道要怎么继续下去问,sum(case xk when '语文' then chengji end)这个什么意思,拿张三的记录来说,语文,数学,英语就只有一个成绩,为什么要用sum,我尝试吧sum去掉,就报错了,这句话到底怎么理解?谢谢
[姓名] [学科] [成绩]
张三 语文 80
张三 数学 86
张三 英语 75
李四 语文 78
李四 数学 85
李四 英语 78 要显示成如下结果:姓名 语文 数学 英语 总成绩
---------- ---------- ---------- ---------- ----------
李四 78 85 78 241
张三 80 86 75 241
总分 158 171 153 482
如何实现?我现在弄成这样姓名 语文 数学 英语 总成绩
---------- ---------- ---------- ---------- ----------
李四 78 85 78 241
张三 80 86 75 241对应SQL为:select name as 姓名,sum(case xk when '语文' then chengji end) as 语文,
sum(case xk when '数学' then chengji end) as 数学,
sum(case xk when '英语' then chengji end) as 英语,
sum(chengji) as 总成绩 from cj group by name;不知道要怎么继续下去问,sum(case xk when '语文' then chengji end)这个什么意思,拿张三的记录来说,语文,数学,英语就只有一个成绩,为什么要用sum,我尝试吧sum去掉,就报错了,这句话到底怎么理解?谢谢
解决方案 »
- oracle统计问题
- 怪事:Oracle数据库的一个表空间不能创建BLOB字段
- 各位老大请帮忙,在线等待。。。
- Sqlserver2008 上 操作 oracle上的两个表更新问题 ?? 求解
- 一个简单的问题,高分求救,急!!!!!!!!!!!!!,在线等待
- alter table table1 cache有啥用啊?
- 为什么我在windows2003下,安装不了oracle 9i
- 哪里有Oracle 9i的下载啊?
- 求一条查询语句。。。。。望高手指教!
- 利用Oracle之SQLPLUS的spool导出文本文件的数据格式问题
- 关于ORACLE的disk_reads值
- 如何对一个表的数据进行分类汇总
sum(case xk when '语文' then chengji end) as 语文是汇总所有语文成绩(虽然每name只有一条记录)
sum(chengji)是总成绩,汇总所有科目。
如果你去掉
sum(case xk when '语文' then chengji end) as 语文,
sum(case xk when '数学' then chengji end) as 数学,
sum(case xk when '英语' then chengji end) as 英语,
前面的sum,那么group by子句必须使用group by name,case xk when '语文' then chengji end,case xk when '数学' then chengji end,case xk when '英语' then chengji end无法达到你的目的
sum(case xk when '数学' then chengji end) as 数学,
sum(case xk when '英语' then chengji end) as 英语,
sum(chengji) as 总成绩 from cj group by name;
----------------------
你可以将所有的sum都去掉,看一下select出来的中间结果,事实上,这个结果应该类似于下面的方式
姓名 语文 数学 英语 总成绩
张三 90 null null 90
张三 null 80 null 80
张三 null null 85 85
ok,看到这个结果的话,楼主应该知道为什么要sum了吧
如果不是数字型,则可能要使用max来聚合
其实你可以看作有个中间表
select t.name as 姓名,case when t.xk='语文' then t.chengji else 0 end as 语文,
case when t.xk='数学' then t.chengji else 0 end as 数学,
case when t.xk='英语' then t.chengji else 0 end as 英语,
sum(chengji) as 总成绩 from cj t