Oracle⾏列转换(⼀)case⾏列转换思路简析思路简析:
1° 准备测试数据:
drop table t purge;
create table t(a varchar2(10), b varchar2(10));
insert into t values('a1','b1');
insert into t values('a1','b2');
commit;
2° 进⾏⾏列转换的数据⼀般是”某⼀列”存在重复冗余的数据,如:
select * from t;
表t的列A中值a1存在重复,可以将a1作为基准,对a1所在的两⾏的列B的数值b1和b2做⾏列转换,⾏转列
因为列B的取值范围有两个b1和b2,因此⾏列转换后会⽣成两列,即两⾏转两列
3° ⽣成新列:
select a, b,
case b when'b1'then'第1个列值⽣成新第1列'
else null
end as b1,
case b when'b2'then'第2个列值⽣成新第2列'
else null
oracle 时间转换end as b2
from t;
使⽤多个case函数对列B的列值进⾏匹配,将匹配到的相应列值转化成新列,⾏转列数据模式初显
4° case语法较为臃肿,使⽤decode函数进⾏改写:
select a, b,
decode(b,'b1','第1个列值⽣成新第1列',null) as b1,
decode(b,'b2','第2个列值⽣成新第2列',null) as b2
from t;
5° 我们已经将B列列值展开成多列,因此剔除B列展⽰,然后先查看展开⽣成的第⼀列,观察特点:
select a, -- b,
decode(b,'b1','第1个列值⽣成新第1列',null) as b1 -- ,
-- decode(b,'b2','第2个列值⽣成新第2列',null) as b2
from t;
此时不难发现,展开⽣成的第⼀列存在空值,意义不⼤,应该过滤掉,可以使⽤where B1 is not null
但是该⽅法需要使⽤⼦查询,因为SQL执⾏顺序是先执⾏where后执⾏select
6° 另外⼀种⽅法是依据A列分组,对B1列进⾏聚合处理,因为B1是字符串,使⽤max或者min均可过滤掉空值:
select a, -- b,
min(decode(b,'b1','第1个列值⽣成新第1列',null)) as b1 -- ,
-- decode(b,'b2','第2个列值⽣成新第2列',null) as b2
from t
group by a;
7° 将所有展开列都依此处理,得出最后SQL:
select a, -- b,
min(decode(b,'b1','第1个列值⽣成新第1列',null)) as b1,
max(decode(b,'b2','第2个列值⽣成新第2列',null)) as b2
from t
group by a;
8° 简单总结:
[TOC]字段值重复是⾏列转换的基础,如果不存在冗余数据列,则⽆法进⾏⾏列转换
⾏列转换的⽅法就是使⽤case或者decode对冗余数据列之外的其他列的列值进⾏展开然后依据冗余数据列分组聚合,最后形成⾏列转换的功能

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。