2

group by 句で指定された列以外の列を選択する方法はありますか? 次のスキーマがあるとします。

Student(id, name, age), Course(id, name, credit), Enrollment(student_id, course_id, grade)

各コースについて次のクエリを実行したい: コースの名前、student_count。

私は回避策を思いつきましたが、これを行うためのよりクリーンな方法があるかどうか疑問に思っていました:

SELECT MAX(c.name), COUNT(distinct e.student_id)
FROM Enrollment e
INNER JOIN Course c ON c.id = e.course_id
GROUP BY e.course_id;
4

2 に答える 2

3

この DDL をコピーし、スキーマに合わせて調整し、質問に貼り付けることをお勧めします。

create table Student(
  student_id integer primary key, 
  student_name varchar(35) not null, 
  age int not null default 20
);

create table Course(
  course_id integer primary key, 
  course_name varchar(35) not null, 
  credit integer not null default 3
);

create table Enrollment(
  student_id integer not null references Student (student_id), 
  course_id integer not null references Course (course_id), 
  primary key (student_id, course_id),
  grade char(1) not null
);

insert into student values 
(1, 'a', 20),
(2, 'b', 20),
(3, 'c', 20);

insert into course values
(1, 'course 1', 3),
(2, 'course 2', 3),
(3, 'course 3', 3);

insert into enrollment values
(1, 1, 'b'),
(2, 1, 'b'),
(3, 1, 'b'),
(1, 2, 'b'),
(2, 2, 'b'),
(3, 3, 'b');

これで、「登録」テーブルのみをクエリすることで、各コースに登録されている学生の数を取得できます。

select course_id, count(student_id) num_students
from enrollment
group by course_id
order by course_id;

course_id  num_students
--
1          3
2          2
3          1

あとは、対応するコース名を取得するだけです。これを行うには、テーブル「Course」を先ほど作成したクエリと結合するだけです。

select course.course_name, course_enrollment.num_students
from course
inner join (select course_id, count(student_id) num_students
            from enrollment
            group by course_id) course_enrollment
        on course.course_id = course_enrollment.course_id;

course_name  num_students
--
course 1     3
course 3     1
course 2     2
于 2013-04-11T19:53:46.720 に答える
2

いいえ、できません。GROUP BYただし、次のように拡張できますc.name

SELECT MAX(c.name), COUNT(distinct e.student_id)
FROM Enrollment e
INNER JOIN Course c ON c.id = e.course_id
GROUP BY e.course_id, c.name

は一意であるためe.course_id、結果は変わりません。

于 2013-04-11T19:36:32.887 に答える