当前位置:   article > 正文

sqlserver行列转换( unpivot 和 pivot)_sqlserver unpivot

sqlserver unpivot

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

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

上案例:

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

效果很明显,给上sql语句

  1. SELECT
  2. [data], [time] ,
  3. up.speeName,
  4. up.speeVal
  5. FROM
  6. [YY2FSC].[dbo].[speetab_1_12]
  7. unpivot(speeVal for speeName in (spee1, spee2,spee3, spee4 , spee5, spee6)) up
  8. WHERE
  9. 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语句

  1. select
  2. createtime,
  3. [0] as [data0],[1] as [data1],[2] as [data2],[3] as [data3],[4] as [data4],[5] as [data5],
  4. [6] as [data6],[7] as [data7],[8] as [data8],[9] as [data9],[10] as [data10],
  5. [11] as [data11],[12] as [data12],[13] as [data13],[14] as [data14],[15] as [data15],
  6. [16] as [data16],[17] as [data17],[18] as [data18],[19] as [data19],[20] as [data20],
  7. [21] as [data21],[22] as [data22],[23] as [data23]
  8. from [YY2FSC_DW].[dbo].[TB_DY_ByHour_Report]
  9. 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
  10. 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语句为

  1. select
  2. ISNULL([Data0],'')+ISNULL([Data1],'')+ISNULL([Data2],'')+ISNULL([Data3],'')+ISNULL([Data4],'')+ISNULL([Data5],'')+ISNULL([Data6],'')+ISNULL([Data7],'')+
  3. ISNULL([Data8],'')+ISNULL([Data9],'')+ISNULL([Data10],'')+ISNULL([Data11],'')+ISNULL([Data12],'')+ISNULL([Data13],'')+ISNULL([Data14],'')+ISNULL([Data15],'')+ISNULL([Data16],'')+ISNULL([Data17],'')
  4. +ISNULL([Data18],'')+ISNULL([Data19],'')+ISNULL([Data20],'')+ISNULL([Data21],'')+ISNULL([Data22],'')+ISNULL([Data23],'') as 数据1
  5. , NULL 数据2
  6. , NULL 数据3
  7. , NULL 数据4
  8. , NULL 数据5
  9. , NULL 数据6
  10. , NULL 数据7
  11. , NULL 数据8
  12. , NULL 数据9
  13. , NULL 数据10
  14. , NULL 数据11
  15. , NULL 数据12
  16. , NULL 数据13
  17. , NULL 数据14
  18. 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的值!

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

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号