一、行转列
在有些应用场景中,如学生成绩。学生所有科目的成绩都保存到一张表里面,当我们需要以列表的形式显示出学生所对应的每一科目的成绩的时候,需要使用到行转列。
示例
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);@H_404_219@
行转列语句
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
@H_404_219@
因为这里使用到了 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
@H_404_219@
结果如下:
也可以使用insert all .. into完成。使用insert all ..。 into 需要新建一个表用来保存转换后的数据。
表结构如下:
结果存放表
test_sc_grade (
3 name 4 course 5 score null
6 )
@H_404_219@
执行语句如下: