SQL GROUP BY QUERY不返回所需的输出

时间:2013-04-25 06:02:15

标签: sql oracle

以下是我的表格和插入值:

create table student (


LastName      varchar(40),
  FirstName     varchar(40),
  SID           number(5),
  SSN           number(9),
  Career        varchar(4),
  Program       varchar(10),
  City          varchar(40),
  Started       number(4),

  primary key (SID),
  unique(SSN)
);
create table enrolled (
  StudentID     number(5),
  CourseID      number(4),
  Quarter       varchar(6),
  Year          number(4),

  primary key (StudentID, CourseID),
  foreign key (StudentID) references student(SID),
  foreign key (CourseID) references course(CID)
);
insert into student
    values ( 'Brennigan', 'Marcus', 90421, 987654321, 'UGRD', 'COMP-GPH', 'Evanston', 2001 );
insert into student
    values ( 'Patel', 'Deepa', 14662, null, 'GRD', 'COMP-SCI', 'Evanston', 2003 );
insert into student
    values ( 'Snowdon', 'Jonathan', 08871, 123123123, 'GRD', 'INFO-SYS', 'Springfield', 2005 );
insert into student
    values ( 'Starck', 'Jason', 19992, 789789789, 'UGRD', 'INFO-SYS', 'Springfield', 2003 );
insert into student
    values ( 'Johnson', 'Peter', 32105, 123456789, 'UGRD', 'COMP-SCI', 'Chicago', 2004 );
insert into student
    values ( 'Winter', 'Abigail', 11035, 111111111, 'GRD', 'PHD', 'Chicago', 2003 );
insert into student
    values ( 'Patel', 'Prakash', 75234, null, 'UGRD', 'COMP-SCI', 'Chicago', 2001 );
insert into student
    values ( 'Snowdon', 'Jennifer', 93321, 321321321, 'GRD', 'COMP-SCI', 'Springfield', 2004 );
insert into enrolled
    values (11035, 1020, 'Fall', 2005);
insert into enrolled
    values (11035, 1092, 'Fall', 2005);
insert into enrolled
    values (11035, 8772, 'Spring', 2006);
insert into enrolled
    values (75234, 3201, 'Winter', 2006);
insert into enrolled
    values (08871, 1092, 'Fall', 2005);
insert into enrolled
    values (90421, 8772, 'Spring', 2006);
insert into enrolled
    values (90421, 2987, 'Spring', 2006);

我有以下查询:

SELECT e.studentid
FROM enrolled e 
FULL OUTER JOIN student s ON e.studentid = s.sid 
WHERE ((e.quarter = 'Fall') OR (e.quarter = 'Spring')) 
GROUP BY e.studentid 
HAVING count(e.studentid) = 1;

但这只会返回

8871

这应该返回

8871
90421

此查询的目标是:列出在秋季季度至少注册一门课程或在春季开设至少一门课程的学生,但不是两者。您将不得不添加几行来测试您的查询。

任何帮助将不胜感激。感谢。

3 个答案:

答案 0 :(得分:3)

尝试一下,

SELECT  a.SID
FROM    student a
        INNER JOIN enrolled b
            ON a.SID = b.StudentID
WHERE   b.quarter IN ('Fall', 'Spring')
GROUP   BY a.SID
HAVING  COUNT(DISTINCT b.quarter) = 1

答案 1 :(得分:2)

SELECT  e.studentid
FROM    enrolled e 
WHERE   e.quarter IN ('Spring', 'Fall')
GROUP BY
        e.studentid 
HAVING  COUNT(DISTINCT quarter) = 1;

90421在春季注册了两门不同的课程,这就是为什么原始查询会将其计算两次。

你需要计算季节,而不是入学。

答案 2 :(得分:0)

学生ID有两个记录 - 90421因此计数将返回2