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

一、这次讲啥

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

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

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('小米' 小米, '华为' 华为, '万达' 万达, '苹果' 苹果, '新浪' 新浪));

三、讲讲思路

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

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

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

 

最后,大家新年快乐~

  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值