sqlserver行列转换( unpivot 和 pivot)

1,unpivot 是将列转为行显示,很多时候,我们用多个列了显示同一个对象不同维度得数据,如果需要数据关联,肯定需要转为横向显示!

思路就是:有一列显示多列的名称,有一列显示列名对应的值

上案例:

要达到得目的是把 spee1,spee2,,,等列转为横向显示,看看得到得效果

效果很明显,给上sql语句

  SELECT  
  [data], [time] ,
  up.speeName,
  up.speeVal
  FROM
    [YY2FSC].[dbo].[speetab_1_12]  
    unpivot(speeVal for speeName in (spee1, spee2,spee3, spee4 , spee5, spee6)) up
  WHERE 
  CAST([data] as datetime)  >='2023-05-10 0:00:00'  and    CAST([data] as datetime) <=  '2023-05-10 0:59:59'  

unpivot(speeVal for speeName in (列名1, 列名2,列名3, 列名4 , 列名5, 列名6)) up

unpivot紧跟表名,up 是别名,不可缺少, speeName 显示转换的列名,speeVal 代表了那么多列的值,然后显示出来就可以了,比较简单!!

2,pivot 是将行转为列显示, 下面这个案例,是把整点的数据按照小时显示成列,纵向排列

 列转行之后的效果图为:

 效果很明显,给上sql语句

select  
  createtime, 
[0] as [data0],[1] as [data1],[2] as [data2],[3] as [data3],[4] as [data4],[5] as [data5],
[6] as [data6],[7] as [data7],[8] as [data8],[9] as [data9],[10] as [data10],
[11] as [data11],[12] as [data12],[13] as [data13],[14] as [data14],[15] as [data15],
[16] as [data16],[17] as [data17],[18] as [data18],[19] as [data19],[20] as [data20],
[21] as [data21],[22] as [data22],[23] as [data23]
from  [YY2FSC_DW].[dbo].[TB_DY_ByHour_Report]
pivot(min([VirtualVoltage] ) for [hour] in ([0],[1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12],[13],[14],[15],[16],[17],[18],[19],[20],[21],[22],[23]))as pvt
order by createtime 

pivot(min([VirtualVoltage] ) for [hour] in ([0],[1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12],[13],[14],[15],[16],[17],[18],[19],[20],[21],[22],[23]))as pvt

in里面的就是hour这列所有的值,将这个值变成了列,一天24小时,从0-23,注意in里面的值必须带有中括号 eq:[0]或者['0'],根据要转的列的类型确定。min是有最小值,但是自己做好分组就可以了! pvt 是别名,不可缺少

其实原理思考清楚了,把多列合并成为一行,把多行显示为列就明白了

有些时候,需要多列合并为一列显示,正好上述是一个date占据一个列,可以是用+运输合并

 sql语句为


select   
ISNULL([Data0],'')+ISNULL([Data1],'')+ISNULL([Data2],'')+ISNULL([Data3],'')+ISNULL([Data4],'')+ISNULL([Data5],'')+ISNULL([Data6],'')+ISNULL([Data7],'')+
ISNULL([Data8],'')+ISNULL([Data9],'')+ISNULL([Data10],'')+ISNULL([Data11],'')+ISNULL([Data12],'')+ISNULL([Data13],'')+ISNULL([Data14],'')+ISNULL([Data15],'')+ISNULL([Data16],'')+ISNULL([Data17],'')
+ISNULL([Data18],'')+ISNULL([Data19],'')+ISNULL([Data20],'')+ISNULL([Data21],'')+ISNULL([Data22],'')+ISNULL([Data23],'') as 数据1

, NULL 数据2
, NULL 数据3
, NULL 数据4
, NULL 数据5
, NULL 数据6
, NULL 数据7
, NULL 数据8
, NULL 数据9
, NULL 数据10
, NULL 数据11
, NULL 数据12
, NULL 数据13
, NULL 数据14 
from  [YY2FSC_DW].[dbo].[TB_ALL_Report]  

对于上面的问题,每行数据显示在不同的列除了上的采用加法运算的方式,还可采用 COALESCE 函数处理,举个栗子:

  SELECT COALESCE(NULL,NULL,'',N'A',N'B',N'C')

 SELECT COALESCE(NULL,NULL,N'A',N'B',N'C','')

发现了问题, COALESCE 是选取当前行的所有列中,从左到右开始,第一个不为NULL的值!

针对上面的情况也是刚刚好, 使用到时候尤其要注意!

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值