oracle pivot 列转行,通俗易懂理解行转列pivot和列转行unpivot

如题,原始表ly_sbzc_zcgzjl(资产跟踪记录表)记录了每件固定资产的跟踪使用记录信息,跟踪类型分为3种(0:调用 ;1:调拨;2:借用),如图一所示:

dd06a1abc3fb84da465ff4eff32374f6.gif

原始数据.png (58.16 KB, 下载次数: 47)

2017-1-29 15:45 上传

图一

(1)现在,我要统计每件资产跟踪类型的次数,每件资产显示一条记录,不同的跟踪类型显示为不同的列,效果如图二如下:

dd06a1abc3fb84da465ff4eff32374f6.gif

行转列pivot.png (28.62 KB, 下载次数: 11)

2017-1-29 15:53 上传

图二

解决方法:可以用行转列pivot进行实现,将多行转为一行,原始数据:资产编号:表记录=1:N,是一对多关系,对于同件资产来说,关键不同点在于跟踪类型(gzlx)的不同,因此可以针对不同的跟踪类型得出每件资产的记录数目。这样,原本多行记录就转为一条记录,不同点(跟踪类型gzlx)经过聚合函数转为现在的不同列(调用次数、调拨次数、报废次数),即:pivot(聚合函数 for 列名 in(类型)),列名就是不同的跟踪类型,即为(调用次数、调拨次数、报废次数),聚合函数即为使用次数,在这里明显就为count(*),于是可以得到sql语句如下,效果如图三所示:

SQL语句一:

select * from (

select zcbh 资产编号,gzlx from ly_sbzc_zcgzjl

) pivot(count(*) for gzlx in ('0' 调用次数,'1' 调拨次数,'2' 报废次数));

dd06a1abc3fb84da465ff4eff32374f6.gif

行转列pivot结果.png (30.17 KB, 下载次数: 12)

2017-1-29 16:17 上传

图三

关键点:找原始记录(针对每件资产)的不同点,对其进行聚合等计算,得出不同列,即行转列pivot.

(2)现在,我要在上面SQL语句一的基础上(跟原始表ly_sbzc_zcgzjl没关系了),统计每件资产不同跟踪类型的次数,对于每件资产,不同跟踪类型显示为不同的记录,即一行记录转为多行记录,关键点在于图三不同列(跟踪类型)的差异,一行记录(不同列)转为多行记录(此时行差别在于跟踪类型),即可以用列转行unpivot来实现,得到sql语句二如下,效果如图四:

SQL语句二:

with lzh as (select * from (

select zcbh 资产编号,gzlx from ly_sbzc_zcgzjl

) pivot(count(*) for gzlx in ('0' 调用次数,'1' 调拨次数,'2' 报废次数)))--with语句理解为数据库表

select 资产编号,gzlx 跟踪类型,dycs 调用次数 from lzh

unpivot (dycs for gzlx in (调用次数,调拨次数,报废次数));

dd06a1abc3fb84da465ff4eff32374f6.gif

列转行unpivot结果.png (43 KB, 下载次数: 14)

2017-1-29 16:45 上传

图四

关键点:找原始记录(针对每件资产的不同列)的不同点,对其进行分类等计算,得出不同行,行区别在于原来的不同列,即列转行unpivot.

总结:对于行转列pivot和列转行unpivot的应用,主要在于根据题目需求,找出原始记录的不同点进行应用,理解起来应该不难,数据流动图如图五:

dd06a1abc3fb84da465ff4eff32374f6.gif

数据流动图解.png (360.57 KB, 下载次数: 6)

2017-1-29 17:00 上传

图五

以上是我对行转列pivot和列转行unpivot的个人理解,如有不到位的地方,希望帮我指出来哈,谢谢丫丫。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值