Oracle行转列

oracle行转列(感觉不该叫这个名字)小记录
一、工具
win10、oracle 11g(之前版本不支持pivot函数)、pl/sql Developer

建表语句

create table r2c(
name varchar2(30),
subject  varchar2(20),
score     number
);

插入数据语句

insert into r2c values('kevin','语文',80);
insert into r2c values('kevin','数学',81);
insert into r2c values('kevin','英语',82);
insert into r2c values('tom','语文',80);
insert into r2c values('tom','数学',81);
insert into r2c values('tom','英语',82);
insert into r2c values('snake','语文',90);
insert into r2c values('snake','数学',91);
insert into r2c values('snake','英语',92);
commit;

查询结果显示
Oracle行转列_第1张图片
1、普通的行转列(max与decode结合):

--就是按照要输出的样式进行重写(原表进行“转置”)
--将原来的表重写为列名为 name  语文  数学  英语  这样式的
--decode用case when then代替也可以
select name,
       max(decode(subject, '语文', score, null)) as "语文", --双引号或者直接中文,单引号会报错
       max(decode(subject, '数学', score, null)) as "数学", --用max这个聚合函数是为了配合group by
       max(decode(subject, '英语', score, null)) as "英语"
  from r2c
 group by name

2、调用pivot函数

--pivot语法:pivot(任一聚合函数 for 需转列的值所在列名 in (需转为列名的值));
select *
  from r2c
pivot(max(score)                 --转换行里需要显示的数据,一般是数字的那列
   for subject in('语文' as "语文", '数学' as "数学", '英语' as "英语"));
   --重新定义列名

两个运行的结果截图都是
在这里插入图片描述

pivot函数差不多就是就干了一个把第一列数据进行分组(就是去重),然后将原表中需要转换的列进行一下转置,再切分转置后的表,这样的工作。
-Oracle行转列_第2张图片

你可能感兴趣的:(oracle)