oracle行转列和列转行

前端之家收集整理的这篇文章主要介绍了oracle行转列和列转行前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

一、行转列

  在有些应用场景中,如学生成绩。学生所有科目的成绩都保存到一张表里面,当我们需要以列表的形式显示出学生所对应的每一科目的成绩的时候,需要使用到行转列。

  示例

 1 --生成绩表
 2 create table grade (
 3     id varchar2(64) not null, 4     name 20)  5     course 100)  6   score number(3)  7     primary key (id)
 8 ) 
 9 
10  初始化数据
11 insert into grade values( '100001',张三语文75);
12 100002数学8013 100003英语14 
15 100004李四8616 1000056617 1000068118 
19 100007王五9220 1000087821 1000098222 
23 100010赵六24 1000119025 1000127726 
27 100013李明6928 10001429 10001580);

  行转列语句

1 select 2 t.name "姓名",128)">3 sum(decode(t.course,t.score,0)">0)) "语文",128)">4 )) "数学",128)">5 )) "英语" 6 from grade t 7 group by t.name

  因为这里使用到了 group by t.name,所以对于要展示score只能使用聚合函数(sum,max,min)都可以,如果不使用聚合函数就会报错。

  执行结果如下:

  

二、列转行

  与行转列相反,有些场景刚好需要这种操作。

  示例如下:

列转行 sc_grade ( 5 cn_score 6 math_score 7 en_score 8 9 ) 10 初始数据 into sc_grade values (1000175,0)">80,0)">1000292,0)">78,128)">14 1000390,0)">1000486,0)">66,0)">1000569,252)">    列传行语句

select name "姓名",0)">' course,cn_score as score sc_grade union 3 score 4 5 score order by "姓名",course

  结果如下:

  也可以使用insert all .. into完成。使用insert all ..。 into 需要新建一个表用来保存转换后的数据。

  表结构如下:

结果存放表 test_sc_grade ( 3 name 4 course 5 score null 6 )

  执行语句如下:

insert all into test_sc_grade(name,course,score) values(name,0)">'score) score) score) select name,cn_score,math_score,0)"> sc_grade; commit; select * from test_sc_grade

  结果查询与上面截图一致。

原文链接:https://www.f2er.com/oracle/212239.html

猜你在找的Oracle相关文章