Oracle行列转换

在oracle中通常会遇到这样的问题,需要将行转换成列,如图:

    

  

一般通常用的函数有以下三种:

 decode:

 case when:

 pivot:

 --oracle 实现行转列
  --创建测试表
  CREATE TABLE student_score(
  name varchar2(20),
  subject varchar2(20),
  score number(4,1)
  );
  --插入测试数据
  INSERT INTO student_score (name,subject,score) values('张三','语文',89);
  INSERT INTO student_score (name,subject,score) values('张三','数学',79);
  INSERT INTO student_score (name,subject,score) values('张三','英语',91);
  INSERT INTO student_score (name,subject,score) values('李四','语文',90);
  INSERT INTO student_score (name,subject,score) values('李四','数学',99);
  INSERT INTO student_score (name,subject,score) values('李四','英语',59);
  INSERT INTO student_score (name,subject,score) values('王五','语文',79);
  INSERT INTO student_score (name,subject,score) values('王五','数学',100);
  INSERT INTO student_score (name,subject,score) values('王五','英语',80);
  INSERT INTO student_score (name,subject,score) values('赵六','语文',86);
  INSERT INTO student_score (name,subject,score) values('赵六','数学',88);
  INSERT INTO student_score (name,subject,score) values('赵六','英语',89);
 --decode 实现行转列
 select name as "姓名" ,
   sum(decode(subject,'语文',nvl(score,0),0)) as "语文" ,
   sum(decode(subject,'数学',nvl(score,0),0)) as "数学",
   sum(decode(subject,'英语',nvl(score,0),0)) as "英语" 
   from student_score
     group by name; 
     
  --case when 行转列
  select name as "姓名",
         sum(case when subject='语文'
             then nvl(score,0)
              else 0
              end ) as "语文",
         sum(case when subject='数学'
             then nvl(score,0)
              else 0
              end )as "数学",
          sum(case when subject='英语'
             then nvl(score,0)
              else 0
              end )as "英语"
         from student_score 
         group by name;
   --pivot 实现行转列
   select * from (select name,subject,score from student_score group by name,subject,score)
    pivot(
       sum(score) for subject in('语文'as "语文",'数学' as "数学",'英语' as "英语")
    );
原文地址:https://www.cnblogs.com/Jims2016/p/5526183.html