pivot和unpivot

1、pivot使用

pivot可以实现将行转列

select sname,苹果,香蕉,西瓜,李子,梨 from
(select sname,fruit,fnum from stest)
pivot
(sum(fnum) for fruit in('苹果' as 苹果,'香蕉' as 香蕉,'西瓜' as 西瓜,'李子' as 李子,'' as 梨))

(将fruit字段的值换成各个字段名,select sname,fruit,fnum from stest里面必不可少fruit、fnum,因为pivot后面的语句会使用)

 

语法:select <非透视的列>,[第一个透视的列],...[最后一个透视的列] from 

           (<生成数据的SELECT查询>)

           pivot

           (<聚合函数> (<要聚合的列>)  for <值要成为字段的列> in ([第一个透视的列],... [最后一个透视的列]))

注释:<非透视的列>=sname

           [第一个透视的列],...[最后一个透视的列]=苹果,...梨 

          <生成数据的SELECT查询>=select sname,fruit,fnum from stest

          <聚合函数> (<要聚合的列>)=sum(fnum)

          <值要成为字段的列>=fruit 

注:在oracle使用 [苹果] 这种表达式会出错,所以需要使用 '苹果 ' as 苹果 这种表达式

 

2、unpivot使用

unpivot可以实现列转行

通过 create table 表名新 as select * from 表名旧 得到一个复制的表

select sname,fruit,fnum from atest
unpivot
(fnum for fruit in(苹果,香蕉,西瓜,李子,梨))

语法:select <未逆透视的列>, <合并后的列名>,<行值的列名>  from <源表>

           unpivot 

           (<行值的列名> for <合并后的列名> in ([第一个合并列],...[最后一个合并列])

注释:<未逆透视的列>=sname

           <合并后的列名>=fruit

           <行值的列名>=fnum

           [第一个合并列],...[最后一个合并列]=苹果,...梨

      

posted @ 2021-10-15 10:49  微风徐徐$  阅读(226)  评论(0编辑  收藏  举报