SQL2008如何将多行转换成多列

原创 2016年08月29日 14:09:15

SQL2008中有两个函数:

  • pivot
  • unpivot

1.pivot可实现数据表的列转行

语法如下:

select * from table pivot( 聚合函数(<列名1>) for  <列名2> in(<转换的行中列2的值1,转换的行中列2的值2,,...>))

例:

declare @temptable table([name] varchar(100),[saletype] varchar(100),[total] decimal(19,2)) 
insert into @temptable([name],[saletype],[total])
select '客户A','商品A','100'
union all
select '客户A','商品A','100'
union all
select '客户A','商品B','200'
union all
select '客户B','商品A','100'
union all
select '客户B','商品B','300'
union all
select '客户C','商品C','400'


select * from @temptable pivot(sum(total) for [saletype] in (商品A,商品B,商品C)) as pvt

这个方法,可以把某一列的值<列名1>求合后按照<列名2>转换到行上,行上的列名分别为in后面(列名2中的值)中的值,这个方法只能转换一列

2.unpivot可实现数据表的行转列

语法如下:

select * from table unpivot(<转换后的值> for <转换后的列> in (<需要转换的列1,需要转换的列2,...>))

declare @temptable1 table([name] varchar(100),total1 decimal(19,2),total2 decimal(19,2),total3 decimal(19,2),total4 decimal(19,2))
insert into @temptable1
select 'A',1,2,3,4
union all
select 'B',11,22,33,44

select [name],[n],[v] from @temptable1
unpivot(v for n in(total1,total2,total3,total4)) a

注意:在in后面()中的值,是不允许重复的。


pivot函数只能把一列的值转到行上去,但现在有一个表如下

declare @temptable2 table([name] varchar(100),dateday varchar(20),qty decimal(19,2),total decimal(19,2))
insert into @temptable2
select 'A','1月1号',20,200
union all
select 'A','2月2号',10,100
union all
select 'A','3月3号',20,200
union all
select 'B','2月1号',10,100
union all
select 'B','1月1号',20,500
union all
select 'C','2月1号',10,100
union all
select 'C','2月2号',100,1000
现在一行有有两列,一个是qty,一个是total如果才能把这两列的转换到一行上去,现在用pivot好像不行,因为他只能转换一列,现在可以看一下上面的数据,应该按到dataday来转换,但又需要转换两个值。现在可以考虑先用unpivot函数先把行换成列,后再用pivot把列转成行。

select * from (
select [name],dateday + n as columname,v from @temptable2 unpivot(v for n in (qty,total)) a
) b pivot(sum(v) for [columname] 
in ([1月1号qty],[1月1号total],[2月2号qty],[2月2号total],[3月3号qty],[3月3号total],
[2月1号qty],[2月1号total])) as c

这个地方还需要注意,有可能你的数据库没有设置兼容运用pivot和unpivot会报错,这个地方把SQL2008设置成

exec sp_dbcmptlevel DBName,100

DBName为对应的数据库名





版权声明:本文为博主原创文章,未经博主允许不得转载。

关于如何将SQL2008 R2数据库迁移到SQL2008

原文(来自百度知道,可能并不是第一作者):  http://zhidao.baidu.com/link?url=GYUn64DxO_yY0Upva2jxnD0fD1JO_NGiuFBG...
  • u012355629
  • u012355629
  • 2014年10月08日 19:09
  • 611

mysql 将多行转换一行

在实际开发中,往往会碰到类似如下的例子:mysql 将多行转换一行
  • liujian928730
  • liujian928730
  • 2016年03月23日 14:06
  • 725

关于oracle的将字符串转换成多行

1.方法一 (sql方法)  with temp0 as         (select LEVEL lv from dual CONNECT BY LEVEL         select f...
  • qq_29464887
  • qq_29464887
  • 2017年06月16日 16:45
  • 608

XML由多行转换成一行

怎么将一个XML文件由一下格式,转换成一行? ...
  • Fanbin168
  • Fanbin168
  • 2015年06月05日 18:59
  • 606

[转]linux tar、rar、zip等命令详解

linux tar、rar、zip等命令详解   linux tar命令详解tar命令tar能为文件和目录创建档案。利用tar,用户能为某一特定文件创建档案(备份文件),也能在档案中改动文...
  • zj19880814
  • zj19880814
  • 2013年10月12日 14:16
  • 919

[Office][Excel][001]如何将一行数据拆成多行?

在Excel中有一行数据 ,现在想通过公式把他按顺序拆分成一个3*3的表格
  • vkindergarten
  • vkindergarten
  • 2017年06月22日 21:06
  • 352

如何将图片转换成BYTE

图片的常见存储与读取凡是有以下几种: 存储图片:以二进制的形式存储图片时,要把数据库中的字段设置为Image数据类型(SQL Server),存储的数据是Byte[]. 1.参数是图片路径:返回B...
  • oYuHuaChen
  • oYuHuaChen
  • 2017年01月22日 15:43
  • 813

如何将视频转换成文字

今天给大家分享一个云端服务平台 – 360converter.com,一款免费的云端文件格式转换平台,特色的服务是视频转文字,mp4转文字,音频转文字,mp3转文字,YouTube视频下载。...
  • huangxiansheng1980
  • huangxiansheng1980
  • 2016年12月07日 13:02
  • 10295

如何将sql2000备份数据库还原到sql2008中

 今天安装了sql server2008,于是乎想将自己原来在2000下备份的数据还原一番,很自然想到了2000下还原数据库的方法:     1、先新建一个数据库,有些同学说这个新建的数据库在...
  • builderwfy
  • builderwfy
  • 2017年07月29日 15:00
  • 1271

mysql/sql多行 转 多列,行属性转列属性

经过一天的奋斗与努力,我发现我越来越佩服我自己了,真的是太NB了,请叫我大侠!多行转多列,废话不多说,开始正文:首先,参考了:http://www.cnblogs.com/kingthy/archiv...
  • strong0511
  • strong0511
  • 2016年04月27日 17:06
  • 2779
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:SQL2008如何将多行转换成多列
举报原因:
原因补充:

(最多只允许输入30个字)