我有以下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;
答案 0 :(得分: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;