MSSQL 行转列

来源:互联网 发布:林子方 知乎 编辑:程序博客网 时间:2024/06/07 18:07

测试数据

if object_id('tb')is not null drop table tbgocreate table tb([年度] varchar(4),[部门] varchar(10), [考核] int)insert  tb values('2012','业务部',86)insert  tb values('2012','办公室',78)insert  tb values('2012','安保部',93)insert  tb values('2013','业务部',75)insert  tb values('2013','安保部',88)insert  tb values('2013','办公室',94)insert  tb values('2014','办公室',90)insert  tb values('2014','安保部',74)insert  tb values('2014','信息部',74)


在SQL2000中,行转列一般都要用聚合函数配合CASE WHEN实现,SQL2005及以后可以用PIVOT实现

2000静态SQL

select [年度],max(case [部门] when '业务部' then [考核] else 0 end)[业务部],max(case [部门] when '办公室' then [考核] else 0 end)[办公室],max(case [部门] when '安保部' then [考核] else 0 end)[安保部]from tbgroup by [年度]
2000动态SQL,指部门数不固定
declare @sql varchar(2000)set @sql='select [年度]'select @sql=@sql+',max(case [部门] when '''+[部门]+''' then [考核] else 0 end) ['+部门+']' from(select distinct [部门] from tb) tset @sql=@sql+' from tb group by [年度]'exec(@sql)

2005静态SQL

select *from tbpivot(max([考核])for [部门]in(业务部,安保部,办公室))p

2005动态SQL

declare @sql varchar(2000)--获取部门数select @sql=isnull(@sql+',','')+quotename([部门]) from tb group by [部门]set @sql='select * from tb pivot(max([考核]) for [部门] in('+@sql+'))p'exec(@sql)


0 0
原创粉丝点击