2012-09-16 24 views
5

Schema:Come eseguire questa query sql?

Student(studentid,name,age) 
Course(coursename,dept) 
enroll(studentid,coursename,grade) 

ho bisogno di scrivere SQL per trovare i nomi degli studenti per ogni fascia di età con il voto massimo per i corsi seguiti dal dipartimento di storia e scienze politiche.

Il mio tentativo è stato finora

SELECT 
    name 
FROM 
    student 
GROUP BY age 
HAVING sid IN 
      (
       SELECT 
        max(grade) 
       FROM 
        enroll e,enroll e1 
       WHERE 
        e.studentid = e1.studentid 
       AND e.coursename = (
            SELECT coursename FROM course 
            WHERE 
             dname like '%History%' 
           ) 
       AND e1.coursename = (
            SELECT coursename FROM course 
            WHERE 
             dname like '%PoliticalScience%' 
            ) 
      ) 
+0

Come si definisce il gruppo di età ?? – vikiiii

+0

La mia ipotesi è che il gruppo di età punti a studenti della stessa età sotto una fascia, quindi il gruppo per età. – user1675198

risposta

0

si può provare qualcosa in queste righe

select 
    s.name 
from 
    student s, enroll e, 
    (
     select 
      s.age as age, e.coursename as coursename, max(e.grade) as grade 
     from 
      student s, course c, enroll e 
     where 
      s.studentid = e.studentid 
     and c.coursename = e.coursename 
     and (c.dept = 'history' or c.dept = 'political science') 
     group by s.age, e.coursename 
    ) t 
where 
    s.studentid = e.studentid 
and s.age = t.age 
and e.grade = t.grade 
and e.coursename = t.coursename 
2

È possibile ottenere il grado superiore utilizzando subquery. Prova,

SELECT d.*, 
     f.dept, 
     e.grade 
FROM student d 
     INNER JOIN enroll e 
      on d.studentID = e.studentID 
     INNER JOIN course f 
      ON e.courseName = f.courseName 
     INNER JOIN 
      (
       SELECT a.age, c.dept, Max(b.grade) maxGrade 
       FROM student a 
         INNER JOIN enroll b 
          on a.studentID = b.studentID 
         INNER JOIN course c 
          ON b.courseName = c.courseName 
       WHERE c.dept IN ('history','political science') 
       GROUP BY a.age, c.dept 
      ) topScore 
      ON topscore.age = d.age AND 
       topscore.dept = f.dept AND 
       topscore.maxGrade = e.grade 
Problemi correlati