Oracle列转行unpivot函数的使用

一、unpivot函数语法
说明:将表中多个列缩减为一个聚合列(多列转多行
语法:unpivot(新列名 for 聚合列名 in (对应的列名1…列名n ))

二、实例应用
1、unpivot的简单应用:

SELECT STU_NAME, TERM, subject, score
  FROM (SELECT '罗飞' STU_NAME,
               '2001-2002' TERM,
               '90' 微积分,
               '88' 线性代数,
               '85' 数据结构,
               '70' 操作系统
          FROM DUAL) UNPIVOT(score FOR subject IN(微积分,
                                                  线性代数,
                                                  数据结构,
                                                  操作系统))

原数据:
在这里插入图片描述

运行结果:
在这里插入图片描述
支持别名:

SELECT STU_NAME, TERM, subject, score
  FROM (SELECT '罗飞' STU_NAME,
               '2001-2002' TERM,
               '90' 微积分,
               '88' 线性代数,
               '85' 数据结构,
               '70' 操作系统
          FROM DUAL) UNPIVOT(score FOR subject IN(微积分   as 'wjf',
                                                  线性代数 as 'xxds',
                                                  数据结构 as 'sjjg',
                                                  操作系统 as 'czxt'))
order by score

运行结果:
在这里插入图片描述
2、unpivot的进阶应用:

with 排名表 as
(select a.*
,dense_rank() over(order by chinese desc) chinese_rank
,dense_rank() over(order by math desc) math_rank
  from (select 'A' as name ,36 chinese, 67 math from dual
        union all                                
        select 'B' as name ,56 chinese, 47 math from dual
        union all                               
        select 'C' as name ,78 chinese, 58 math from dual
        union all                                
        select 'D' as name ,53 chinese, 96 math from dual
        union all                                
        select 'E' as name ,87 chinese, 63 math from dual
        ) a
 order by name
)

select name,学科,成绩,排名
from 排名表
unpivot
( (成绩,排名) for 学科 in ((chinese,chinese_rank) as '语文',
                         (math   ,math_rank  ) as '数学')
)
order by name

1)原数据

自定义一张表数据
2)列转行
在这里插入图片描述
3)增加分数排名
在这里插入图片描述
4)列转行
在这里插入图片描述

三、参考资料
1、ORACLE中一个简单的UNPIVOT例子
2、Oracle函数——列转行功能unpivot使用的简单举例

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值