2016-11-06 107 views
0

鉴于以下模式,我应该为这些问题编写查询。编写SQL查询需要帮助(连接,子查询)

我的第一个查询运行但我没有得到结果,第二个查询出现subquery returns more than one row错误。

student (sid, sname, sex, birthdate, gpa) 
prof (pname, dname) 
course (cnum, dname, cname) 
section (cnum, secnum, pname) 
enroll (sid, cnum, secnum, grade) 
  1. 对于每门课程,返回段(numsections)的数量,学生的总入学人数(numstudents),平均品位(avggrade),以及不同的教授谁教课程的数量(numprofs) 。只显示化学或计算机科学系的课程。确保显示课程,即使他们没有学生。如果没有教授教授课程,不要显示课程。

  2. 返回至少两门课程中获得高于其课程部分平均成绩的学生。通过比平均水平和课程编号顺序只显示前5

SQL查询:

SELECT C.cnum, C.cname, COUNT(*) AS numsections, COUNT(E.sid) AS numstudents, 
AVG(E.grade) AS avggrade, COUNT(P.pname) AS numprofs 
FROM course C 
    JOIN section S ON C.cnum = S.cnum 
    JOIN enroll E ON C.cnum = E.cnum 
    JOIN prof P ON S.pname = P.pname 
WHERE C.cname = 'Chemistry' OR C.cname = 'Computer Science' 
GROUP BY C.cnum, C.cname;` 


SELECT S.sid, S.sname 
FROM student S 
    LEFT JOIN enroll E ON S.sid = E.sid 
WHERE E.grade > (SELECT AVG(grade) 
       FROM course C JOIN enroll E2 
       ON C.cnum = E2.cnum 
       GROUP BY C.cnum 
       LIMIT 5);` 
+2

请仔细阅读[**如何对向**](http://stackoverflow.com/help/how-to-ask) \t \t这里是一个伟大的地方,[** **开始执行](http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/)了解如何提高您的问题质量并获得更好的答案。 –

回答

0

关于第二个查询...

你的子查询获得超过1数据行。要使用“<”,你需要确保你只带1行,只有1列。

如果我理解正确的话,你只需要显示前5位的学生顺序的次数是比课程的平均水平好。我真的这是一个学习的例子,所以它不会帮助,如果我给您查询..

您需要选择前5名的学生,但要知道,你必须COUNT()的次数,他们GRADEAVG(大于)每个当然,他们已经采取了,在你的子查询中的某个时刻,你应该按照他们达到平均数以上的次数排列学生名单。