1112周末作业

学生表stu和成绩表score
使用sql查询每个学生的平均成绩并从高到低排序,若存在学生在表stu中无其考试记录的情况,其平均成绩默认为零

学生表stu

sidname
001张三
002李四
003lisa
004jerry
005tom

成绩表score

sidgidgrade
001a90
002a80
003b95
002c60
004a70
002b100

期望结果

sidnameavg_grade
001张三90
002李四80
003lisa95
004jerry70
005tom0

建表语句

create table stu(
                 sid   varchar2(10) --学号
                 ,name varchar2(10) --姓名
                );

insert into stu values('001','张三' );
insert into stu values('002','李四' );
insert into stu values('003','lisa' );
insert into stu values('004','jerry' );
insert into stu values('005','tom' );
commit;

create table score(
                   sid    varchar2(10) --学号
                   ,gid   varchar2(4)  --科目
                   ,grade number(4)    --成绩
                  );
 
insert into score values('001','a',90); 
insert into score values('002','a',80);
insert into score values('003','b',95);
insert into score values('002','c',60);
insert into score values('004','a',70);
insert into score values('002','b',100); 
commit;
              
select * from stu;
select * from score;
/*
左连接
以学生表stu为主表
分组
注意:空值转换
*/
select t1.sid
      ,t1.name  
      ,nvl(avg(t2.grade), 0) as avg_grade  
from stu t1
left join score t2
       on t1.sid = t2.sid
group by t1.sid, t1.name  
order by  nvl(avg(t2.grade), 0) desc;

根据余额拉链历史表acct,使用sql计算每个账户在[2020/1/1, 2020/3/31]期间的利息=bal×rate×days÷360

acct_idbalratestet
账号余额利率开始日期结束日期
0015000.0122019010120191215
00110000.0152019121520200116
00120000.0152020011630001231
00215000.0152019123120200126
002100000.0152020012620200306
0029000.0152020030630001231

建表语句

create table acct(
                  acctid varchar2(10) --账号
                  ,bal   number(20)   --余额
                  ,rate  number(7,4)  --利率
                  ,st    date         --开始日期
                  ,ed    date         --结束日期  
                 );

insert into acct values('001','500','0.012',to_date('20190101','yyyymmdd'),to_date('20191215','yyyymmdd'));
insert into acct values('001','1000','0.015',to_date('20191215','yyyymmdd'),to_date('20200116','yyyymmdd'));
insert into acct values('001','2000','0.015',to_date('20200116','yyyymmdd'),to_date('30001231','yyyymmdd'));
insert into acct values('002','1500','0.015',to_date('20191231','yyyymmdd'),to_date('20200126','yyyymmdd'));
insert into acct values('002','10000','0.015',to_date('20200126','yyyymmdd'),to_date('20200306','yyyymmdd'));
insert into acct values('002','900','0.015',to_date('20200306','yyyymmdd'),to_date('30001231','yyyymmdd'));
commit;

select * from acct;
/*
先计算出在 20200101 到 20200331 期间的数据
再重新定义 每条数据的开始 结束日期 
最后套计算公式
*/
select  t1.acctid
      ,round(sum(t1.bal * t1.rate *(t1.end_date - t1.start_date)/360),4) as sum_rate_amt
from (
      select t.acctid,
             t.bal,
             t.rate,
             t.st,
             t.et
             ,case when t.st < to_date(20200101,'yyyymmdd') then  to_date(20200101,'yyyymmdd')
                   else t.st  end as start_date
             ,case when t.et > to_date(20200331,'yyyymmdd') then to_date(20200331,'yyyymmdd')+1 --【注意】结束日期要+1,最后这天算在内
                  else t.et end end_date    
      from acct t 
      where t.st <= to_date(20200331,'yyyymmdd')
      and t.et >=  to_date(20200101,'yyyymmdd')
     ) t1 
group by t1.acctid;

查询出互为好友的数据

user_idfriend_id
用户编号好友编号
12
21
34
43
41
/*
自联结
t1.friend_id = t2.user_id
t1.user_id = t2.friend_id
调整数据 case when 
去重数据 group by 
*/
with tmp as 
(
select 1 user_id,2 friend_id from dual 
union all
select 2 user_id,1 friend_id from dual 
union all
select 3 user_id,4 friend_id from dual 
union all
select 4 user_id,3 friend_id from dual 
union all
select 4 user_id,1 friend_id from dual 
)
--select t1.user_id
       --,t1.friend_id
select case when t1.user_id < t1.friend_id then t1.user_id 
                 else t1.friend_id end as u_id1
      ,case when t1.friend_id < t1.user_id then t1.user_id 
             else t1.friend_id  end as u_id2
from tmp t1---本人的数据
inner join tmp t2---好友的数据
        on t1.friend_id = t2.user_id
       and t1.user_id = t2.friend_id ---本人的id = 好友的好友id 
group by case when t1.user_id < t1.friend_id then t1.user_id 
                 else t1.friend_id end 
      ,case when t1.friend_id < t1.user_id then t1.user_id 
             else t1.friend_id  end 
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

只会HelloWorld的华娃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值