Oracle一道题实现四种行转列的形式

题目需求的表数据

create table STUDENT_SCORE
(
name VARCHAR2(20),
subject VARCHAR2(20),
score NUMBER(4,1)
);
insert into student_score (NAME, SUBJECT, SCORE) values (‘张三’, ‘语文’, 78.0);
insert into student_score (NAME, SUBJECT, SCORE) values (‘张三’, ‘数学’, 88.0);
insert into student_score (NAME, SUBJECT, SCORE) values (‘张三’, ‘英语’, 98.0);
insert into student_score (NAME, SUBJECT, SCORE) values (‘李四’, ‘语文’, 89.0);
insert into student_score (NAME, SUBJECT, SCORE) values (‘李四’, ‘数学’, 76.0);
insert into student_score (NAME, SUBJECT, SCORE) values (‘李四’, ‘英语’, 90.0);
insert into student_score (NAME, SUBJECT, SCORE) values (‘王五’, ‘语文’, 99.0);
insert into student_score (NAME, SUBJECT, SCORE) values (‘王五’, ‘数学’, 66.0);
insert into student_score (NAME, SUBJECT, SCORE) values (‘王五’, ‘英语’, 91.0);

表中数据显示:

在这里插入图片描述

题目:

得到类似下面的结果
姓名 语文 数学 英语
王五 89 56 89

第一种方式:decode

select ss.name,
max(decode(ss.subject, ‘语文’, ss.score)) 语文,
max(decode(ss.subject, ‘数学’, ss.score)) 数学,
max(decode(ss.subject, ‘英语’, ss.score)) 英语
from student_score ss
group by ss.name;

结果:
在这里插入图片描述

第二种方式:case when then end

select ss.name,
max(case ss.subject
when ‘语文’ then
ss.score
end) 语文,
max(case ss.subject
when ‘数学’ then
ss.score
end) 数学,
max(case ss.subject
when ‘英语’ then
ss.score
end) 英语
from student_score ss
group by ss.name;

结果:
在这里插入图片描述

第三种方式:join

(相当于92语法中的等值连接)

–需求的三张表
select ss.name,ss.score from student_score ss where ss.subject=‘语文’;
在这里插入图片描述
select ss.name,ss.score from student_score ss where ss.subject=‘数学’;
在这里插入图片描述
select ss.name,ss.score from student_score ss where ss.subject=‘英语’;
在这里插入图片描述

–将三张表合并,分别显示对应的列
select ss01.name, ss01.score 语文, ss02.score 数学, ss03.score 英语
from (select ss.name, ss.score
from student_score ss
where ss.subject = ‘语文’) ss01
join (select ss.name, ss.score
from student_score ss
where ss.subject = ‘数学’) ss02
on ss01.name = ss02.name
join (select ss.name, ss.score
from student_score ss
where ss.subject = ‘英语’) ss03
on ss01.name = ss03.name;

结果:
在这里插入图片描述

第四种方式:union all

(全集:将两个集合的数据全部显示,不会完成去重的操作)

–如第三种方式中的三张表,不同的是,其他的列用0填充,得到如图表t:
在这里插入图片描述

–具体实现
select t.name, sum(t.语文) 语文, sum(t.数学) 数学, sum(t.英语) 英语
from (select ss01.name, ss01.score 语文, 0 数学, 0 英语
from student_score ss01
where ss01.subject = ‘语文’
union all
select ss02.name, 0 语文, ss02.score 数学, 0 英语
from student_score ss02
where ss02.subject = ‘数学’
union all
select ss03.name, 0 语文, 0 数学, ss03.score 英语
from student_score ss03
where ss03.subject = ‘英语’) t
group by t.name;

结果:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值