博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Oracle通过pivot和unpivot配合实现行列转换
阅读量:2134 次
发布时间:2019-04-30

本文共 1227 字,大约阅读时间需要 4 分钟。

一、这次讲啥

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 ('小米', '华为', ...)),结果就是最终要的效果了。

 

最后,大家新年快乐~

转载地址:http://fmkgf.baihongyu.com/

你可能感兴趣的文章
【面试】一份自我介绍模板
查看>>
【自动化测试】自动化测试需要了解的的一些事情。
查看>>
【selenium】selenium ide的安装过程
查看>>
【手机自动化测试】monkey测试
查看>>
【英语】软件开发常用英语词汇
查看>>
Fiddler 抓包工具总结
查看>>
【雅思】雅思需要购买和准备的学习资料
查看>>
【雅思】雅思写作作业(1)
查看>>
【雅思】【大作文】【审题作业】关于同不同意的审题作业(重点)
查看>>
【Loadrunner】通过loadrunner录制时候有事件但是白页无法出来登录页怎么办?
查看>>
【English】【托业】【四六级】写译高频词汇
查看>>
【托业】【新东方全真模拟】01~02-----P5~6
查看>>
【托业】【新东方全真模拟】03~04-----P5~6
查看>>
【托业】【新东方托业全真模拟】TEST05~06-----P5~6
查看>>
【托业】【新东方托业全真模拟】TEST09~10-----P5~6
查看>>
【托业】【新东方托业全真模拟】TEST07~08-----P5~6
查看>>
solver及其配置
查看>>
JAVA多线程之volatile 与 synchronized 的比较
查看>>
Java集合框架知识梳理
查看>>
笔试题(一)—— java基础
查看>>