Oracle通过pivot和unpivot配合实现行列转换

一、这次讲啥

pivot的用法之前有写过了,然后前几天呢,某群友提了个比较奇葩的需求,需要用到行列互转,效果如下

Oracle通过pivot和unpivot配合实现行列转换_第1张图片

虽然感觉这种数据展现方法比较奇葩,但是实现起来还是比较有意思的,特记录一下。

pivot和unpivot的用法我就不重复讲了,可以看下面的测试代码理解一下。

二、sql

1、测试数据准备

-- 建个表测试
create table orgCost(
       orgNm varchar2(8),  -- 公司名
       cost1 number(8),  -- 差旅费
       cost2 number(8),  -- 交通费
       cost3 number(8)   -- 保护费
);

-- 插入测试数据
insert into orgCost (ORGNM, COST1, COST2, COST3)
values ('小米', 10, 33, 23);
insert into orgCost (ORGNM, COST1, COST2, COST3)
values ('华为', 20, 22, 23);
insert into orgCost (ORGNM, COST1, COST2, COST3)
values ('万达', 10, 11, 25);
insert into orgCost (ORGNM, COST1, COST2, COST3)
values ('苹果', 20, 44, 25);
insert into orgCost (ORGNM, COST1, COST2, COST3)
values ('新浪', 22, 55, 24);
commit;
/

2、实现行列转换

-- 实现转换
select *
  from (select 公司, 费用名称, 费用
          from (select orgnm 公司, cost1 差旅费, cost2 餐费, cost3 保护费
                  from orgcost a) unpivot(费用 for 费用名称 in(差旅费, 餐费, 保护费)))
pivot(max(费用)
   for 公司 in('小米' 小米, '华为' 华为, '万达' 万达, '苹果' 苹果, '新浪' 新浪));

三、讲讲思路

Oracle通过pivot和unpivot配合实现行列转换_第2张图片

公司列要转为多列,但数据列有3列,不能直接用pivot把公司直接转换。那我们就先把后面几个数据列,也就是那几个费用,先转换到一列上,然后用一列说明费用名称,转换后的列名就是:公司、费用名称、费用,这个可以用unpivot来实现,代码(选中部分)及效果如下:

Oracle通过pivot和unpivot配合实现行列转换_第3张图片

那接下来就好玩了嘛,费用名称作为固定列,公司作为转换列,费用为数据列,直接用pivot对这个结果集转换

select * from () pivot (sum(费用) for 公司 in ('小米', '华为', ...)),结果就是最终要的效果了。

Oracle通过pivot和unpivot配合实现行列转换_第4张图片

 

最后,大家新年快乐~

你可能感兴趣的:(Oracle,sql,plsql)