pivot的用法之前有写过了,然后前几天呢,某群友提了个比较奇葩的需求,需要用到行列互转,效果如下
虽然感觉这种数据展现方法比较奇葩,但是实现起来还是比较有意思的,特记录一下。
pivot和unpivot的用法我就不重复讲了,可以看下面的测试代码理解一下。
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('小米' 小米, '华为' 华为, '万达' 万达, '苹果' 苹果, '新浪' 新浪));
公司列要转为多列,但数据列有3列,不能直接用pivot把公司直接转换。那我们就先把后面几个数据列,也就是那几个费用,先转换到一列上,然后用一列说明费用名称,转换后的列名就是:公司、费用名称、费用,这个可以用unpivot来实现,代码(选中部分)及效果如下:
那接下来就好玩了嘛,费用名称作为固定列,公司作为转换列,费用为数据列,直接用pivot对这个结果集转换
select * from () pivot (sum(费用) for 公司 in ('小米', '华为', ...)),结果就是最终要的效果了。
最后,大家新年快乐~