測試數據
if object_id('tb')is not null drop table tb
go
create 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 tb
group by [年度]
2000動態SQL,指部門數不固定
[sql] view plaincopy在CODE上查看代碼片派生到我的代碼片
declare @sql varchar(2000)
set @sql='select [年度]'
select @sql=@sql+',max(case [部門] when '''+[部門]+''' then [考覈] else 0 end) ['+部門+']'
from(select distinct [部門] from tb) t
set @sql=@sql+' from tb group by [年度]'
exec(@sql)
2005靜態SQL
select *
from tb
pivot(
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)