需求:查看学生各类课程已获得的总学分。最终效果如下。

场景:数据库的结构中有三张表,学生表,课程表,成绩表。每个课程有着不同的学分,所以需要查学生的成绩中对应的课程。然后SUM求和。

先简单用sql来实现,

SELECT 
g.s_num number, s.name name, c.name, SUM(c.credit)
FROM grade g, course c, student s 
WHERE  g.c_id = c.id AND s.number = g.s_num GROUP BY g.s_num,c.sort;

发现事情并不简单,课程类别显示在行内,那这样一个人的结果就有好几个了。如何只是一对一还可以在java中用map来映射,现在一个人就有好几条结果,无疑给我增加了不少难度。想了很多方法,最后还是想把他换成列。

整理后的sql语句,很明显效果就是我需要的了。

只需要把别名改成英文,就可以在java中一一映射。

SELECT
g.s_num number, s.name name,
SUM(CASE c.sort WHEN '专业支撑课' THEN c.credit END) 专业支撑课,
SUM(CASE c.sort WHEN '公共必修课' THEN c.credit END) 公共必修课,
SUM(CASE c.sort WHEN '集中实践课' THEN c.credit END) 集中实践课,
SUM(CASE c.sort WHEN '素质拓展课' THEN c.credit END) 素质拓展课,
SUM(CASE c.sort WHEN '专业拓展课' THEN c.credit END) 专业拓展课,
SUM(CASE c.sort WHEN '专业核心课' THEN c.credit END) 专业核心课
FROM grade g, course c, student s WHERE  g.c_id = c.id AND s.number = g.s_num GROUP BY g.s_num ORDER BY s.claee;


Last modification:April 15, 2021
如果觉得我的文章对你有用,请随意赞赏