sqlserver 和oracle unpivot列转行同时需要行转列,效果对比

mssql 专栏收录该内容
8 篇文章 0 订阅

同学的原表结构如下:
表名称:JIANGLING_INTERSECT_TURN
在这里插入图片描述
需要转换的效果如下:
在这里插入图片描述
思路分析

  • 同学想要的效果,第一个需要将列标题beta_l_n,beta_r_n,beta_l_e,beta_r_e,beta_l_w,beta_r_w,beta_l_s,beta_r_s转换为行值,所以需要unpivot 操作

  • 第二需要将time_during对应的行值属性进行行转列操作,故需要再次pivot 操作

  • 上篇文章已经讲了pivot操作,这里不再赘述mssqlserver中的关于pivot 的语法讲解

  • 主要介绍unpivot 操作

  • unpivot 语法如下UNPIVOT函数的格式如下:

  • UNPIVOT ([转换为行的列值在转换后对应的列名] for [转换为行的列名在转换后对应的列名] in
    ([转换为行的列1],[转换为行的列2],[转换为行的列3],…[转换为行的列N]))

  • [转换为行的列值在转换后对应的列名]这个是进行列转行的列其数据值在转换为行后的列名称

  • [转换为行的列名在转换后对应的列名]这个是进行列转行的列其列名在转换为行后的列名称 [转换为行的列]这个是声明哪些列要进行列转行

测试代码如下

if object_id('tempdb..#test') is not null
  drop table #test
create  table #test
( name varchar(200),
  time_during varchar(200),
  ln decimal(18,3),
  rn decimal(18,3),
  le decimal(18,3),
  re decimal(18,3),
  ls decimal(18,3),
  rs decimal(18,3),
  lw decimal(18,3),
  rw decimal(18,3)
 ) 
 --select * from #test
 
 insert into #test 
 values( '江陵西路-仲英大道', '早高峰' ,0.155477032, 0.5795053, 0.195845697, 0.008902077, 0.542574257, 0.398019802, 0.112219451, 0.226932668)
--,('江陵西路-仲英大道', '早高峰', 0.155477032, 0.5795053, 0.195845697, 0.008902077, 0.542574257, 0.398019802, 0.112219451, 0.226932668)
 insert into #test 
 values
('江陵西路-仲英大道', '平峰', 0.102564103, 0.58974359, 0.168674699, 0.036144578, 0.641975309, 0.216049383, 0.121527778, 0.378472222)

 insert into #test 
 values
('江陵西路-仲英大道', '晚高峰', 0.096, 0.448,0.257142857, 0.053968254, 0.41509434, 0.344339623, 0.112745098 ,0.385620915)

 insert into #test 
 values
('江陵西路-西塘河路' ,'早高峰', 0.155172414, 0.844827586, 0.135371179, 0.026200873, 0.228070175, 0.280701754, 0.094059406 ,0 )
 

select * from #test 效果如下:
在这里插入图片描述
第一步:列转行

if object_id('tempdb..#t') is not null
  drop table #t 
select name,time_during,data_type,a into #t from (select name,time_during,ln,rn,le,re,ls,rs,lw,rw from #test) bb
unpivot ( a for data_type in(ln,rn,le,re,ls,rs,lw,rw) ) 
as unpv order by data_type;


select *from #t
插叙效果如下,注意原来的4行数据,8列进行列转行后,编程了32行数据,很容易理解,对于原表的每一行记录,所对应的8列进行列转行后,每行变成8行,所以这步操作后,数据行变成了32行
在这里插入图片描述
第二步操作:

select name,data_type,早高峰,平峰,晚高峰 from #t 
pivot( 
sum(a) for time_during in(早高峰,平峰,晚高峰)
 ) as pv order by name,data_type

转换后的效果为:
在这里插入图片描述

如果是oracle 的操作有哪些不同呢?
贴代码,然后分析之

select name,data_type,早高峰,晚高峰,平峰 from(
select name,time_during,data_type,a  from ( select name,time_during,ln,rn,le,re,ls,rs,lw,w from test) bb
unpivot ( a for data_type in(ln,rn,le,re,ls,rs,lw,w) ) 
) tb 
pivot 
( sum(a) for time_during in('早高峰' as 早高峰 ,'晚高峰' as 晚高峰,'平峰' as 平峰)
 ) 

分析区别和不同点

  1. oracle的测试表,我用的test 临时表名称,基本数据和创建表的过程,请自行脑补,上面已经提供数据
  2. 区别点,下面上图
    在这里插入图片描述
  • 1
    点赞
  • 2
    评论
  • 0
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

评论2
请先登录 后发表评论~
©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页

打赏作者

浪子的情怀

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值