SQL查询(GROUP BY)

时间:2014-11-30 00:54:07

标签: sql database oracle

我有以下DB outlint:   等级(SID,CID,学期,年级,年级)   学生(SID,姓名,专业)

第一个问题是:
        对于每个学生,列出学生的姓名和成功完成的课程数量。         请注意,如果学生获得“W”或“F”以外的成绩,则课程已成功完成。此外,数据库中可能有两个或更多学生具有相同的名称。

我有以下查询,但我不确定它是否正确。由于只需要使用DB的结构来回答,我没有要测试的数据。即使我没有在select子句中指定SID,我是否可以按SID进行分组?

SELECT Name, COUNT(SID)
FROM STUDENT S, GRADE G
WHERE S.SID = G.SID
AND G.Grade != "W"
AND  G.Grade != "F"
GROUP BY SID, Name;

1 个答案:

答案 0 :(得分:0)

  • 您必须按照SID进行分组,因为您的说明明确指出学生可能具有相同的名称。
  • 您必须继续进行OUTER加入成绩,否则如何展示完成0门课程的学生?
  • 然后COUNT应该适用于整个组,不需要在那里指定任何列。

查询:

SELECT s.SID, s.Name, COUNT(*)
FROM 
    STUDENT S 
        LEFT JOIN GRADE G ON S.SID = G.SID AND G.Grade != "W" AND  G.Grade != "F"
GROUP BY s.SID, s.Name;

但是现在,我认为你省略了一些信息。我相信还有一个课程表,我是否正确?因为现在,此查询返回兼容成绩的数量,而不是传递的课程数。

此外,如果您只需要显示名称,那么您必须在子查询中包含此查询:

查询:

SELECT t.Name, t.cnt FROM (
    SELECT s.SID, s.Name, COUNT(*) as cnt
    FROM 
        STUDENT S 
            LEFT JOIN GRADE G ON S.SID = G.SID AND G.Grade != "W" AND  G.Grade != "F"
    GROUP BY s.SID, s.Name
) t;