首页
登录 | 注册

oracle 列转行 行转列

在我们查询数据,向前端展示时,有时要进行行转列或者列转行,因为java暂时还有没有相应的API进行集合的行列转换,只能时通过我们的工具类或者自定义方法进行转换

转:https://www.cnblogs.com/ken-jl/p/8570518.html

废话不多说先建一个表

create table Fruit(id int,name varchar(20), Q1 int, Q2 int, Q3 int, Q4 int);
insert into Fruit values(1,'苹果',1000,2000,3300,5000);
insert into Fruit values(2,'橘子',3000,3000,3200,1500);
insert into Fruit values(3,'香蕉',2500,3500,2200,2500);
insert into Fruit values(4,'葡萄',1500,2500,1200,3500);

看一下查询结果

oracle 列转行 行转列

1.函数 unpivot:列转行   ====>select 未转换列名....,转换列名字段A,展示数据字段B from 表名TABLE unpivot  (B for A  in (被转换的列名...))

select id , name, jidu, xiaoshou from Fruit unpivot (xiaoshou for jidu in (q1, q2, q3, q4));

oracle 列转行 行转列

 

ok,接下来就是列转行,来一个复杂点的,将行转列的数据再列转行回去,还原数据

select * from 
(select id , name, jidu, xiaoshou from Fruit unpivot (xiaoshou for jidu in (q1, q2, q3, q4))) 
pivot (max(xiaoshou) for jidu in ('Q1' as q1,'Q2' AS q2,'Q3' AS q3,'Q4' AS q4))

oracle 列转行 行转列

好的,是不是有点懵比了

详解一下行转列:

2.函数 pivot:行 专列  ====>select * from 表名TABLE pivot  (max(B(展示的数据的列名)) for A(被转换数据的列名)in (被转换的列的去重数据))


select '四川省' nation ,'第一' ranking, '成都市' city  from dual union all 
select '四川省' nation ,'第二' ranking, '绵阳市' city  from dual union all 
select '四川省' nation ,'第三' ranking, '德阳市' city  from dual union all 
select '四川省' nation ,'第四' ranking, '宜宾市' city  from dual union all 
select '湖北省' nation ,'第一' ranking, '武汉市' city  from dual union all 
select '湖北省' nation ,'第二' ranking, '宜昌市' city  from dual union all 
select '湖北省' nation ,'第三' ranking, '襄阳市' city  from dual;
                                  
with temp as(                     
select '四川省' nation ,'第一' ranking, '成都市' city  from dual union all 
select '四川省' nation ,'第二' ranking, '绵阳市' city  from dual union all 
select '四川省' nation ,'第三' ranking, '德阳市' city  from dual union all 
select '四川省' nation ,'第四' ranking, '宜宾市' city  from dual union all 
select '湖北省' nation ,'第一' ranking, '武汉市' city  from dual union all 
select '湖北省' nation ,'第二' ranking, '宜昌市' city  from dual union all 
select '湖北省' nation ,'第三' ranking, '襄阳市' city  from dual 
)
select * from (select nation,city,ranking from temp) pivot
 (max(city) for ranking in ('第一' as 第一,'第二' AS 第二,'第三' AS 第三,'第四' AS 第四));

oracle 列转行 行转列

oracle 列转行 行转列

 

 

好好看一下sql语句和表结构就能出来了!

 



2020 jeepxie.net webmaster#jeepxie.net
10 q. 0.008 s.
京ICP备10005923号