oracle中创建一个有关学生、各年各科成绩、总分的视图,具体sql怎么写,求助!

李伟峰丶 2018-03-23 12:23:35
学生表student:学号sid、姓名sname、年龄sage、性别ssex
课程course:课程号cid、课程名cname
学生成绩grade:学号sid、课程号cid、学年gyear、成绩gscore

我写出来的查询结果类似这样
张三 语文 2015年 80
张三 数学 2015年 86
张三 英语 2015年 75
张三 语文 2016年 80
张三 数学 2016年 86
张三 英语 2016年 75

李四 语文 2015年 78
李四 数学 2015年 85
李四 英语 2015年 78
李四 语文 2016年 78
李四 数学 2016年 85
李四 英语 2016年 78

但是我想想这样的效果:
姓名 年份 语文科目 数学科目 英语科目 总分
张三 2015 74 45 22 66
张三 2016 74 45 22 66
李四 2015 74 45 22 66
李四 2016 74 45 22 66
求大神帮忙看一下,谢了!!!
...全文
2046 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
小尚 2018-04-12
  • 打赏
  • 举报
回复

SELECT a.sname, a.year, c.cname, SUM(decode(c.cname, '语文', c.gscore, 0)) 语文,
			 SUM(decode(c.cname, '数学', c.gscore, 0)) 数学,
			 SUM(decode(c.cname, '英语', c.gscore, 0)) 英语, SUM(c.gscore) 总分
	FROM student a, grade b, course c
 WHERE a.sid = b.sid
			 AND b.cid = c.cid
 GROUP BY a.sname, a.gyear, c.cname;
小尚 2018-04-12
  • 打赏
  • 举报
回复

SELECT a.sname, b.year, c.cname, SUM(decode(c.cname, '语文', b.gscore, 0)) 语文,
			 SUM(decode(c.cname, '数学', b.gscore, 0)) 数学,
			 SUM(decode(c.cname, '英语', b.gscore, 0)) 英语, SUM(b.gscore) 总分
	FROM student a, grade b, course c
 WHERE a.sid = b.sid
			 AND b.cid = c.cid
 GROUP BY a.sname, b.gyear, c.cname; 
asymmetric 2018-04-09
  • 打赏
  • 举报
回复
case when
sych888 2018-04-02
  • 打赏
  • 举报
回复
CASE WHEN 的经典案例
caodia 2018-03-29
  • 打赏
  • 举报
回复
select st.sname 姓名,g.gyear 年份, (case when c.cname='语文' then g.gscore else null end) "语文科目", (case when c.cname='数学' then g.gscore else null end) "数学科目", (case when c.cname='英语' then g.gscore else null end) "英语科目", sum(g.gscore) 总分 from student st,grade g left join course c on c.cid=g.cid where g.sid=st.sid group by st.sname ,g.gyear order by g.gyear asc; case when的转置
wubing1111 2018-03-29
  • 打赏
  • 举报
回复
要做行转列ORACLE中好像有个函数不记得了,自己找一下吧
丨大浣熊丨 2018-03-27
  • 打赏
  • 举报
回复
如果一直都是要你后面说的那种结果的话,就是 年份 姓名 语文 数学 英语 。。。这样的 。如果是这样成绩表的结构设计就有问题,应该直接设计成这总格式的,而不是你这总格式 学生成绩grade:学号sid、课程号cid、学年gyear、成绩gscore。数据量大了查询速度上会有很大的差距
丨大浣熊丨 2018-03-27
  • 打赏
  • 举报
回复
select distinct gyear,sname,(select gscore from course c,grade b where c.cid=b.cid and cname='数学' and a.gyear=b.gyear) 数学,(select gscore from course c,grade b where c.cid=b.cid and cname='语文' and a.gyear=b.gyear) 语文,(select gscore from course c,grade b where c.cid=b.cid and cname='英语' and a.gyear=b.gyear) 英语,(select sum(gscore) from grade e where e.sid= d.sid and e.gyear=a.gyear) 总和 from grade a,student d where a.sid=d.sid
qq_41888172 2018-03-23
  • 打赏
  • 举报
回复
select st.sname 姓名,g.gyear 年份, (case when c.cname='语文' then g.gscore else null end) "语文科目", (case when c.cname='数学' then g.gscore else null end) "数学科目", (case when c.cname='英语' then g.gscore else null end) "英语科目", sum(g.gscore) 总分 from student st,grade g left join course c on c.cid=g.cid where g.sid=st.sid group by st.sname ,g.gyear order by g.gyear asc;
卖水果的net 2018-03-23
  • 打赏
  • 举报
回复

select 姓名, 年份, 
sum(case when 科目 = '语文' then 成绩 else 0 end) 语文,
sum(case when 科目 = '数学' then 成绩 else 0 end) 数学,
sum(成绩) 总分
from t
group by 姓名, 年份

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧