首页 > 数据库技术 > 详细

oracle 行转列

时间:2020-11-30 15:37:43      阅读:16      评论:0      收藏:0      [点我收藏+]

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
*/
--至少使用4中方式下写出
--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 方式
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方式
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 distinct 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 方式
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

运行效果如下:

技术分享图片

 

oracle 行转列

原文:https://www.cnblogs.com/whyrun/p/14060443.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!