SQL查询获取某些学生成绩的课程编号

时间:2014-07-21 19:52:57

标签: sql oracle

我正在解决一些问题,而且我似乎无法获得这个问题的预期结果。问题在于下面我现在的代码中的内容以及预期的结果。如果有人帮助那将是伟大的。我只是试图理解这一点,似乎无法理解这究竟是什么,因为你可以看到我现在的代码与现在的预期结果不相近。此外,我添加了架构,如果您的帮助需要,这将显示在什么表中。

问题

列出课程的课程数量,其中学生已经获得了每种可能定义的年级类别的成绩。按课程编号排序。

到目前为止我的代码:

SELECT g.Student_id, g.Grade_type_code
FROM Grade g LEFT OUTER JOIN Section s
ON g.Section_id = s.Section_id
GROUP BY g.Student_id, g.Grade_type_code
ORDER BY g.Student_id;

任何帮助都会很棒,here is the Schema

DBMS:我正在使用Oracle SQL Developer

这是预期结果

COURSE_NO
----------
20
25
100
120
122
125
130
135

注意:此问题的章节基于

LEFT OUTER JOIN

我目前的结果

STUDENT_ID GRADE_TYPE_CODE
---------- ---------------
   102 FI              
   102 HM              
   102 MT              
   102 PA              
   102 QZ              
   103 FI              
   103 HM              
   103 MT              
   103 PA              
   103 QZ              
   104 FI              
   104 HM              

2 个答案:

答案 0 :(得分:1)

根据您的ER图表,我相信此查询应该返回一个课程列表,其中已注册的学生共同收到了GRADE_TYPE表中列出的所有成绩类型。

select s.course_no,
       c.descr,
       count(distinct g.grade_type_code) as num_grade_types
  from grade g
  join enrollment e
    on g.student_id = e.student_id
   and g.section_id = e.section_id
  join section s
    on e.section_id = s.section_id
  join course c
    on s.course_no = c.course_no
 group by s.course_no, c.descr
having count(distinct g.grade_type_code) = (select count(grade_type_code)
                                              from grade_type)

我没有注意到你的预期结果只是课程#(你可以从选择列表中删除你不想要的列)。此外,COURSE表的连接仅用于获取课程描述,因此如果您不希望选择课程描述,则不需要该连接。

答案 1 :(得分:0)

您需要选择COURSE_NO。并且还使用JOIN而不是LEFT JOUTER JOIN。

这样的事情:

从中选择COURSE_NO ( SELECT distinct(s.COURSE_NO) 来自Grade g JOIN Section s ON g.Section_id = s.Section_id ) ORDER BY s.COURSE_NO;