1

问题是:对于每个部门,列出他们提供的课程的所有部分的最大和最小入学人数,只考虑那些有一些入学人数的部分——也就是说,不要担心那些没有学生参加该部分的部分。

Department(dept_name, building, budget)
Section(course_id, sec_id, semester, year, building, room_number, time_slot_id)
student(student_id, name, major, tot_cred)
takes(student_id, course_id, sec_id, semester, year, grade)
course(course_id, title, dept_name, credits)

查询:

SELECT * 
  FROM course 
  NATURAL JOIN (SELECT count(student_id) AS tot 
  FROM takes NATURAL JOIN section GROUP BY course_id)

^^^ 提供注册。需要找到 Max 和 Min

4

3 回答 3

2

您将为此使用子查询:

select min(cnt), max(cnt)
from (select dept_name, count(*) as cnt
      from student s join
           takes t
           on s.student_id = t.student_id join
           course c
           on t.course_id = c.course_id join
           department d
           on c.department_id = d.department_id
      group by dept_name
     ) t

为此,我假设您有一个course带有部门 ID 的表。您上面的表格没有与部门的链接。

您的查询根本没有意义。永远不要在FROM子句中使用“,”。如果要进行交叉连接,请明确使用CROSS JOIN. 我希望您的查询在任何数据库中都有语法错误,因为enrollment未定义。

于 2012-10-02T21:40:38.880 回答
1

在您的情况下,您只需要关心 table takes。这是我的方法:

SELECT MAX(enrollment) MaxEnrollment, MIN(enrollment) MinEnrollment
FROM (
    SELECT COUNT(student_id) enrollment 
    FROM takes
    GROUP BY course_id, sec_id, semester, year
    ) a;
于 2018-10-20T09:46:07.270 回答
0
select
    course_id,
    min(tot_per_course_sec) min_section_enrolment,
    max(tot_per_course_sec) max_section_enrolment
from course
natural join (
    select course_id, sec_id, count(student_id) as tot_per_course_sec
    from takes
    natural join section
    group by course_id, sec_id
    having count(student_id) > 0
    ) sec_grouped
于 2012-10-03T00:42:11.263 回答