我是数据库的初学者,我有以下内容:我需要展示那些有最多不正确学生的类(class)(所以那些还没有带书的人和那些迟于 date_to_return 带书的人)
表格类(class):类(class)代码、类(class)名称。
表 pupils_on_courses:pupil_id,course_code。
表学生:pupil_id
表 books_out_on_loan:pupil_id、isbn、date_borrowed、date_to_return_date_returned
我试图找出每个部分的不正确学生的数量,但现在我一直在寻找最大值。
我认为错误在于我计算date_returned
& date_to_return
select
c.course_code, c.course_name, count (bb.pupil_id)
from
courses c
inner join
pupils_on_courses ps on c.course_code = ps.course_code
inner join
pupils p on p.pupil_id = ps.pupil_id
inner join
books_out_on_loan bb on p.pupil_id = bb.pupil_id
group by
c.course_code, c.course_name
having
count (bb.pupil_id) = (select max(count(*))
from pupil p
inner join books_out_loan bb on p.pupil_id = bb.pupil_id
where bb.date_returned is null
or bb.date_returned > date_to_return
group by c.course_code, c.course_name)
非常感谢您的帮助
最佳答案
select
c.course_code, min(c.course_name) course_name,
count(distinct pc.pupil_id) as max_pupil_cnt
from
courses c inner join pupils_on_courses pc
on ps.course_code = c.course_code
inner join books_out_on_loan b
on b.pupil_id = pc.pupil_id
where b.date_returned is null or b.date_returned > b.date_to_return
group by c.course_code
having count (distinct pc.pupil_id) >= all (
select count(distinct pc2.pupil_id)
from pupils_on_courses pc2 inner join books_out_loan b2.
on b2.pupil_id = pc2.pupil_id
where b2.date_returned is null or b2.date_returned > b2.date_to_return
group by pc2.course_code
);
有现代方法可以做到这一点,无需重复逻辑。我猜你需要坚持基本的东西,因为这看起来像是家庭作业。
关于数据库的 SQL 查询查找学生的 nr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60103169/