数据库题:行转列

create table tb_stu_info(

id number(4) ,

name varchar2(20),

course varchar2(20),

score number(5,2)

);

insert into tb_stu_info values(1,'张三','语文',81);

insert into tb_stu_info values(2,'张三','数学',75);

insert into tb_stu_info values(3,'李四','语文',86);

insert into tb_stu_info values(4,'李四','数学',90);

insert into tb_stu_info values(5,'王五','语文',81);

insert into tb_stu_info values(6,'王五','数学',100);

insert into tb_stu_info values(7,'王五','英语',90);

commit;


需要达成的目标形式:



--看目标图片分析。每个人有语文、数学、英语。所以需要将原数据按姓名分组

--分组

select name from tb_stu_info group by name



--成绩该怎么显示呢?


--分析,推演

select name ,decode(course, '语文', score) "语文" from tb_stu_info



--继续,推演

select name ,

decode(course, '语文' , score) "语文",

decode(course, '数学' , score) "数学",

decode(course, '英语' , score) "英语"

from tb_stu_info



--然后,分组,按姓名分组

select name ,

min(decode (course, '语文', score)) "语文",

min(decode (course, '数学', score)) "数学",

min(decode (course, '英语', score)) "英语"

from tb_stu_info group by name






总结 :利用 分组+decode函数

select name ,

min (decode (course, '语文', score)) "语文",

min (decode (course, '数学', score)) "数学",

min (decode (course, '英语', score)) "英语"

from tb_stu_info group by name




面试题2:

查询出每门课都大于80分的学生名字,分数,课程。

--每门课分数都大于80


--统计课程数

select count (distinct course) cn from tb_stu_info


--查询每门课大于80分-->一个人的分数最低的>80即可-->按学生分组、然后过滤组()

select name ,min(score), count(*) from tb_stu_info group by name having min(score)>80 ;


--综合。注意,课程数必须要对应。。count(*)是课程数

select name ,min(score), count(*) from tb_stu_info group by name having min(score)>80

and count (*)=(select count(distinct course) cn from tb_stu_info);


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值