需求:查询一次考试的成绩(一次考试有多个课程)并计算单科和总分班级排名,年级排名表结构入下
考试信息表 简称表a
examid(考试id主键),gradeid(年级id),classid(班级id),schoolid(学校id)
100                   020                0200               02
考试课程表 简称表b  
examid(考试id外键)  courseid(考试课程id 主键) code(考试课程代码)
课程代码表 简称表c
code(考试课程代码) name(课程名字)
单科成绩表 简称表d
courseid(考试课程id) point(分数)   studentid(学号), studentname(姓名) 主键为courseid+studentid
成绩总表   简称表e
classid(班级id主键)    
examid(考试id),   point(分数)   studentid(学号), studentname(姓名) 主键为examid+studentid
班级信息表 f
classid(班级id),schoolid(学校id),classname(班级名字) 主键classid
学生信息表 g
studentid(学生id),studentname(学生姓名),classid(班级id),schoolid(学校id)主键stidentid
在页面上显示的图形为
班级       姓名  化学(科目)  物理       总分
高一(1)  a     100  1  1     80 10 17   180  5  9
...........
...........
其中化学下面的第一个1为班级排名第二个1为年级排名。
我的思路是通过考试id查询出考试科目。然后通过union 单科成绩表 和 成绩总表
这个sql语句该怎么写呢?3ks

解决方案 »

  1.   

    用left join实现
    先取班级姓名,再关联成绩,再把成绩相加就ok
      

  2.   

    很有意思的sql问题,但是难度并不高,比较费时,所以别人不愿意帮你写;给你如下提示,你应该可以搞定:对一个单科,例如化学,按照分数排序,取出rownum即其排名,然后按照这个方法,依次取出班级排名、年级排名,再按照学号关联,得出你最后的信息。
    BTW:你这个数据库设计很规范,典型的按照第三范式设计,但是排名作为一个很重要的信息应该作为一个字段的。这样你用procudure就搞定了。