MSSQL 行轉列

測試數據

 
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
  1. declare @sql varchar(2000)  
  2. --獲取部門數  
  3. select @sql=isnull(@sql+',','')+quotename([部門]) from tb group by [部門]  
  4. set @sql='select * from tb pivot(max([考覈]) for [部門] in('+@sql+'))p'  
  5. exec(@sql)  

發佈了52 篇原創文章 · 獲贊 0 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章