Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL查询(分组依据)_Sql_Database_Oracle - Fatal编程技术网

SQL查询(分组依据)

SQL查询(分组依据),sql,database,oracle,Sql,Database,Oracle,我有以下数据库大纲: 年级(SID、CID、学期、年份、年级) 学生(SID、姓名、专业) 第一个问题是: 列出每个学生的姓名和成功完成的课程数。 请注意,如果学生的成绩不是“W”或“F”,则课程成功完成。此外,数据库中可能有两个或多个学生同名 我有以下疑问,但我不确定它是否正确。我没有要测试的数据,因为我只需要使用DB的构造来回答。即使在select子句中没有指定SID,我也可以按SID分组吗 SELECT Name, COUNT(SID) FROM STUDENT S, GRADE G WH

我有以下数据库大纲: 年级(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;
  • 您必须按SID分组,因为您的说明明确指出学生可能有相同的名字
  • 您必须继续与成绩进行外部联接,否则如何显示已完成0门课程的学生
  • 然后,
    计数
    应应用于整个组,无需在其中指定任何列
查询:

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;
但是现在,我想你遗漏了一些信息。我相信也有一张课程表,对吗?因为现在,这个查询返回的是兼容的分数,而不是通过的课程数

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

查询:

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;

是的,即使在select子句中未选择sid,也可以按sid分组。使用显式连接语法。从学生S加入S.sid=g.sid和g.grade上的g年级!='W级和g级!='谢谢你。到那时我能把小组里的名字除掉吗?我通常会使用我的教授的加入。它真的很奇怪,让我们使用它,因为一些未知的原因。是的,你可以如上所述。但在我看来,有一个不好的计算领域,你应该计算(cid)课程,而不是学生。你的评论给我留下了深刻的印象。我不知道你的老师为什么强迫你使用隐式连接。标准是ANSI SQL,ANSI SQL至少从1992年开始推荐显式连接。不知道,我上学期让他做DB,我用了一个内部连接,他问了一百万个问题,为什么我用内部连接而不是使用,