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
[第一个合并列],...[最后一个合并列]=苹果,...梨