SQL 不及格课程数大于2的学生的平均成绩及其排名

数据

create table scores
(
  sid int,
  score int,
  cid int
);

insert into scores values
(1, 90, 1),
(1, 59, 2),
(1, 67, 3),
(2, 20, 1),
(2, 30, 2),
(2, 40, 3),
(3, 14, 1),
(3, 13, 2),
(3, 15, 3),
(4, 90, 1),
(4, 90, 2),
(4, 87, 3)
;

sql

select t1.sid, t1.average_score, count(distinct t2.sid) as rank_n
from 
(
  select sid, avg(score) as average_score
  from scores
  where sid in
  (
    select sid from scores
    where score <= 60
    group by sid
    having count(cid) >=2
  )
  group by sid
) t1
left join
(
  select sid, avg(score) as average_score
  from scores
  group by sid
) t2
on t1.average_score <= t2.average_score
group by t1.sid
order by t1.average_score desc
;

or 先排名再筛选

select t1.sid, t1.average_score, count(distinct t2.sid) as rank_n
from 
(
  select sid, avg(score) as average_score
  from scores
  group by sid
) t1
left join
(
  select sid, avg(score) as average_score
  from scores
  group by sid
) t2
on t1.average_score <= t2.average_score
where t1.sid in
(
  select sid from scores
  where score <= 60
  group by sid
  having count(cid) >=2
)
group by t1.sid
order by t1.average_score desc
;

猜你喜欢

转载自blog.csdn.net/itnerd/article/details/108130522