SQL查询以查找每门课程都获得A的学生

SQL查询以查找每门课程都获得A的学生,sql,oracle,Sql,Oracle,我有以下模式: Studentssid、名字、姓氏、状态、gpa、电子邮件 课程部门代码、课程、标题 Classesclassid、部门代码、课程、门派、年份、学期、限制、班级规模 注册SSID、classid、lgrade 我需要一些帮助来找出每门课程都获得A的所有学生。试试这个 select * from students where sid not in (select distinct sid from enrollement where coalesce (lgrade,'X') &

我有以下模式:

Studentssid、名字、姓氏、状态、gpa、电子邮件

课程部门代码、课程、标题

Classesclassid、部门代码、课程、门派、年份、学期、限制、班级规模

注册SSID、classid、lgrade

我需要一些帮助来找出每门课程都获得A的所有学生。

试试这个

select * from students 
where sid not in (select distinct sid from enrollement where coalesce (lgrade,'X') <> 'A')
这意味着:所有学生的成绩都是A
如果您还想获得课程和课程的名称,您还必须同时加入两个表

我建议使用聚合:

select e.sid
from enrollement e
group by e.sid
having min(lgrade) = max(lgrade) and min(lgrade) = 'A';

尽量不要想得太多:

SELECT s.*
  FROM STUDENTS s
  WHERE s.GPA = 4.0
这适用于A=4,B=3,C=2,D=1,F=0的美国标准评分系统

对于非标准系统,如我的孩子高中,荣誉和进修课程A=5,我们不能相信GPA:

SELECT s.*
  FROM STUDENTS s
  INNER JOIN (SELECT SID, COUNT(*) AS CLASS_COUNT
                FROM ENROLLMENTS
                GROUP BY SID) cc
  INNER JOIN (SELECT SID, COUNT(*) AS A_GRADE_COUNT
                FROM ENROLLMENTS
                WHERE LGRADE = 'A'
                GROUP BY SID) ag
    ON ag.SID = s.SID
  WHERE CLASS_COUNT = A_GRADE_COUNT

祝你好运。

我想这是最清楚的:

select e.sid
from enrollement e
group by e.sid
having count(case when lgrade = 'A' then 1 else 0 end) = count(*) and count(*) > 0

您尝试了什么?lgrade是否被限制为非空值?还有,可能的分数是多少?例如,是否有A+,A,A-如果有,你真正需要什么-所有成绩都是A,或者所有成绩都不低于A,或者不低于A-?为什么要回答这个作业,但学生什么也没做?这将返回根本没有成绩的学生。从技术上讲,这符合要求,因为每修一门课都得A,但我猜这不是OP的意图。我将其更改为不修lgrade nullis not in将导致语法错误。ISNULL将导致另一个。也许这不是Oracle SQL?无论如何,OP从一开始就把它标记为甲骨文,所以这是我的-1。@GordonLinoff-也许你是对的,但那会令人失望。一个根本没上过课的学生实际上是一个所有课程都得了A的学生。我知道外行可能会有问题,但是使用关系数据库的人应该比外行更熟悉基本集合论。我再次编辑了它,oracle支持coalesce,解决方案中消除了额外的键入错误