如题,原始表ly_sbzc_zcgzjl(资产跟踪记录表)记录了每件固定资产的跟踪使用记录信息,跟踪类型分为3种(0:调用 ;1:调拨;2:借用),如图一所示:
原始数据.png (58.16 KB, 下载次数: 47)
2017-1-29 15:45 上传
图一
(1)现在,我要统计每件资产跟踪类型的次数,每件资产显示一条记录,不同的跟踪类型显示为不同的列,效果如图二如下:
行转列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' 报废次数));
行转列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 (调用次数,调拨次数,报废次数));
列转行unpivot结果.png (43 KB, 下载次数: 14)
2017-1-29 16:45 上传
图四
关键点:找原始记录(针对每件资产的不同列)的不同点,对其进行分类等计算,得出不同行,行区别在于原来的不同列,即列转行unpivot.
总结:对于行转列pivot和列转行unpivot的应用,主要在于根据题目需求,找出原始记录的不同点进行应用,理解起来应该不难,数据流动图如图五:
数据流动图解.png (360.57 KB, 下载次数: 6)
2017-1-29 17:00 上传
图五
以上是我对行转列pivot和列转行unpivot的个人理解,如有不到位的地方,希望帮我指出来哈,谢谢丫丫。