高级sql

某学校需要将学生们各科成绩汇总成一个汇总表,学校共有学生50名,要求将每个月的单门考试得分最高的三人的其他科目得分进行汇总,并按总分排序;

 

创建表结构如下:
create table t_student_score
(
 id varchar2(20),--学生ID
 name varchar2(80),--学生姓名
 gender varchar2(2),--学生性别
 subject varchar2(20),--科目
 mnth varchar2(6),--考试月份
 score number(10,2)--考试得分
);

 select t.*
   from (select t.id,
                t.name,
                t.gender,
                t.mnth,
                t.subject,
                t.score,
                tt.totalscore,
                (tt.totalscore - t.score) lasttotal
           from (select t.id, t.name, t.gender, t.mnth, t.subject, t.score
                   from (select t.id,
                                t.name,
                                t.gender,
                                t.mnth,
                                t.subject,
                                t.score,
                                rank() over(partition by t.mnth, t.subject order by t.score desc) rnk
                           from t_student_score t) t
                  where t.rnk < 2) t,
                (select t.id,
                        t.name,
                        t.gender,
                        t.mnth,
                        sum(t.score) totalscore
                   from t_student_score t
                  group by t.id, t.name, t.gender, t.mnth) tt
          where t.id = tt.id
            and t.mnth = tt.mnth) t
  order by t. mnth, t.totalscore

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值