1

私はすでに 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 句にも含まれていないため、選択リストでは無効です。

この問題を解決する方法を教えてください。

4

5 に答える 5

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

于 2012-10-22T19:20:04.480 に答える
1

関数COUNT()は、タペル/行の数をカウントし、結果を表示します。結果のすべての行をカウントする場合は、単一の値の結果が得られ、残りの結果とは互換性がありません。単一の結果をどこに配置し、行ごとに繰り返しますか?

そのため、GROUPBY句を追加する必要があります。これを行うことで、多数のタプルをグループ化し、グループごとにそれらをカウントして、各グループカウントの単一の結果を表示できます。

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

エラーメッセージに示されているように、countは集計関数であり、1つの結果のみを表示し、複数のタプルを持つSELECTと組み合わせることはできません。

于 2012-10-22T19:25:56.953 に答える
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クエリにaを追加する)必要があります。そうすると、異なるSectionNoの総数ではなく、行数が取得されます。

Title、SectionNo、およびSemesterで合計を取得する場合は、次の3つの列すべてでGROUPBYする必要があります。

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;
于 2012-10-22T19:20:46.397 に答える
0

エラーメッセージは実際には非常に簡単です: You are missing a GROUP BYclause

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
于 2012-10-22T19:18:23.187 に答える
0

と でグループ化する必要がありc1.Titleますe1.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
于 2012-10-22T19:19:33.530 に答える