2012-10-22 86 views
1

我已经创建了SQL的某些表已经,它们低于:如何在SQL中编写查询?

CREATE TABLE Courses(
    CourseNo INTEGER CHECK(CourseNo>=100 AND CourseNo<=999) PRIMARY KEY, 
    Title VARCHAR(100) NOT NULL, 
    ) 

CREATE TABLE CourseSections(
    CourseNo INTEGER CHECK(CourseNo>=100 AND CourseNo<=999), 
    SectionNo INTEGER, 
    InstructorNo INTEGER NOT NULL, 
    Year INTEGER, 
    Semester INTEGER, 
    RoomNo INTEGER NOT NULL, 
    Weekday INTEGER NOT NULL, 
    StartTime INTEGER NOT NULL, 
    FinishTime INTEGER NOT NULL, 
    Capacity INTEGER NOT NULL, 
    PRIMARY KEY(CourseNo, SectionNo, Year, Semester) 
    ) 

CREATE TABLE Instructor(
    InstructorNo INTEGER PRIMARY KEY, 
    FirstName VARCHAR(40) NOT NULL, 
    LastName VARCHAR(40) NOT NULL 
    ) 

CREATE TABLE Students(
    StudentNo INTEGER PRIMARY KEY, 
    FirstName VARCHAR(40) NOT NULL, 
    LastName VARCHAR(40) NOT NULL, 
    Year INTEGER, 
    GPA REAL 
    ) 

CREATE TABLE Enrollments(
    CourseNo INTEGER CHECK(CourseNo>=100 AND CourseNo<=999), 
    Year INTEGER, 
    Semester INTEGER, 
    SectionNo INTEGER, 
    StudentNo INTEGER, 
    Grade REAL, 
    PRIMARY KEY(CourseNo, Year, Semester, SectionNo, StudentNo) 
    ) 

CREATE TABLE Areas(
    AreaName VARCHAR(40) PRIMARY KEY 
    ) 

CREATE TABLE AreasOfCourse(
    CourseNo INTEGER CHECK(CourseNo>=100 AND CourseNo<=999), 
    AreaName VARCHAR(40), 
    PRIMARY KEY(CourseNo, AreaName) 
    ) 

CREATE TABLE AreasOfInstructor(
    InstructorNo INTEGER, 
    AreaName VARCHAR(40), 
    PRIMARY KEY(InstructorNo, AreaName) 
    ) 

现在,我想找到每门课程的标题,以及该课程,每学期的招生总数,我必须写一个查询为了这。所以我的工作如下:

SELECT c1.Title, COUNT(e1.SectionNo), e1.Semester 
FROM Courses c1, Courses c2, Enrollments e1, Enrollments e2 
WHERE c1.CourseNo = c2.CourseNo AND e1.Semester = e2.Semester AND 
        e1.SectionNo <> e2.SectionNo 

执行此查询时出现错误。错误是:

列“Courses.Title`是在选择列表中无效,因为包含在聚合函数或GROUP BY子句是不 。

任何人都可以帮我弄清楚如何解决这个问题吗?

回答

1

函数COUNT()计算tupels/rows的数量并显示结果。如果你想统计结果中的所有行,那会给你一个单一的值结果,并且与结果的其余部分不兼容。它将把单个结果放在哪里,对每一行重复它?

因此,您需要添加一个GROUP BY子句。通过这样做,可以将多个元组分组在一起,然后按每个组计算它们,并显示每个组计数的单个结果。

SELECT c1.Title, COUNT(e1.SectionNo), e1.Semester 
FROM Courses c1, Courses c2, Enrollments e1, Enrollments e2 
WHERE c1.CourseNo = c2.CourseNo 
    AND e1.Semester = e2.Semester 
    AND e1.SectionNo <> e2.SectionNo 
GROUP BY c1.Title, e1.Semester 

作为该错误消息表示,计数的聚集函数,仅显示1个结果,不能以选择具有多个元组进行组合。

0

错误消息其实是非常简单的:你缺少一个GROUP BY条款

SELECT c1.Title, COUNT(e1.SectionNo), e1.Semester 
FROM Courses c1, Courses c2, Enrollments e1, Enrollments e2 
WHERE c1.CourseNo = c2.CourseNo AND e1.Semester = e2.Semester AND 
        e1.SectionNo <> e2.SectionNo 
GROUP BY c1.Title, e1.Semester 
0

那么你需要按c1.Titlee1.Semester

SELECT c1.Title, COUNT(e1.SectionNo), e1.Semester 
FROM Courses c1, Courses c2, Enrollments e1, Enrollments e2 
WHERE c1.CourseNo = c2.CourseNo 
    AND e1.Semester = e2.Semester 
    AND e1.SectionNo <> e2.SectionNo 
GROUP BY c1.Title, e1.Semester 
1

如果我给你的权利,你的查询有点过于复杂

select 
    C.Title, 
    E.Semester, 
    count(*) as Enrollment 
from Courses as C 
    left outer join Enrollments as E on E.CourseNo = C.CourseNo 
group by 
    C.Title, 
    E.Semester 

http://sqlfiddle.com/#!6/efa4b/1

0
SELECT c1.Title, COUNT(e1.SectionNo), e1.Semester 
    FROM Courses c1, 
     Courses c2, 
     Enrollments e1, 
     Enrollments e2 
    WHERE  c1.CourseNo = c2.CourseNo 
      AND e1.Semester = e2.Semester 
      AND e1.SectionNo <> e2.SectionNo 

没有保证c1.Title将留在不同e1.SectionNo相同,所以SQL将不知道该怎么回答。

你必须组的结果通过标题(添加GROUP BY c1.Title到查询),你会得到的计数,而不是不同SectionNo的总数。

如果你想拥有的标题,SectionNo和学期总,你必须GROUP BY所有三列:

SELECT c1.Title, e1.SectionNo, e1.Semester, COUNT(*) AS total 
    FROM Courses c1, 
     Courses c2, 
     Enrollments e1, 
     Enrollments e2 
    WHERE  c1.CourseNo = c2.CourseNo 
      AND e1.Semester = e2.Semester 
      AND e1.SectionNo <> e2.SectionNo 
    GROUP BY c1.Title, e1.SectioNo, e1.Semester; 

或者,如果你想通过标题和学期的部分,

SELECT c1.Title, e1.Semester, COUNT(e1.SectionNo) AS total 
    FROM Courses c1, 
     Courses c2, 
     Enrollments e1, 
     Enrollments e2 
    WHERE  c1.CourseNo = c2.CourseNo 
      AND e1.Semester = e2.Semester 
      AND e1.SectionNo <> e2.SectionNo 
    GROUP BY c1.Title, e1.Semester;