来自:  http://3zfp.cnblogs.com/archive/2005/11/16/79084.html
原文的SQL语句有些小错误,下面的是改正且测试通过的。感谢原文作者 :)


有一个表:  
BH            GZLB          JE  
----------------------  
001            A              100  
001            B              150  
001            C              110  
002            A              99  
002            B              180  
002            C              150  
003            A              160  
003            B              170  
003            C              130  
用SQL语句如何将上面的表变成下面横向的排列方式呢。  
BH        A      B      C  
-------------------  
001    100    150  110  
002    99     180  150  
003    160    170  130        
(GZLB  里面的字段是动态的,不是只有A,B,C  可能还有A,B,C,D,E...)  

先创建以上的测试数据表
SQL语句实现横排if  exists(select  name  from  sysobjects  where  name='tblA'  and  xtype='U')   
SQL语句实现横排     
drop  table  tblA   
SQL语句实现横排  
SQL语句实现横排
create  table  tblA(   
SQL语句实现横排   BH  
char(3)  not  null,   
SQL语句实现横排   GZLB  
varchar(3)  not  null,   
SQL语句实现横排   JE  
int  not  null   
SQL语句实现横排)   
SQL语句实现横排
go   
SQL语句实现横排  
SQL语句实现横排
insert  tblA  values('001',            'A',              100)   
SQL语句实现横排
insert  tblA  values('001',            'B',              150)   
SQL语句实现横排
insert  tblA  values('001',            'C',              110)   
SQL语句实现横排
insert  tblA  values('002',            'A',              99)   
SQL语句实现横排
insert  tblA  values('002',            'B',              180)   
SQL语句实现横排
insert  tblA  values('002',            'C',              150)   
SQL语句实现横排
insert  tblA  values('003',            'A',              160)   
SQL语句实现横排
insert  tblA  values('003',            'B',              170)   
SQL语句实现横排
insert  tblA  values('003',            'C',              130)   
SQL语句实现横排

以下是两种不同实现方法,一种用游标一种不用。
declare  @sql  varchar(6000)   
   
set  @sql  =  'select  '   
   
select  @sql  =  @sql  +'  sum(case  GZLB  when  '''+  GZLB  +'''  then  JE  else  null  end)  ['+  GZLB  +'],'  from  (select  distinct  GZLB  as  GZLB    from  tblA)  tmp   
   
set  @sql  =  substring(@sql,  1,  len(@sql)-1)  +'  from  tblA  group  by  BH'   
   
exec(@sql)   

执行结果如图:
SQL语句实现横排

下面这个是用游标实现:
SQL语句实现横排declare  @sqlstr  varchar(2000)   
SQL语句实现横排
declare  @gzlb   varchar(3
SQL语句实现横排
set  @sqlstr='select  bh'  
SQL语句实现横排 
SQL语句实现横排
DECLARE @cgzlb CURSOR  
SQL语句实现横排
SET @cgzlb = CURSOR LOCAL SCROLL FOR     
SQL语句实现横排  
select distinct  gzlb  from  tblA   
SQL语句实现横排 
SQL语句实现横排
create  table  #tmpA   
SQL语句实现横排(bh  
char(3))   
SQL语句实现横排 
SQL语句实现横排
open  @cgzlb   
SQL语句实现横排
fetch  next  from  @cgzlb  into  @gzlb   
SQL语句实现横排
WHILE @@FETCH_STATUS = 0 
SQL语句实现横排
begin   
SQL语句实现横排 
SQL语句实现横排 
exec('alter  table #tmpA  add  '+@gzlb  +'  int')   
SQL语句实现横排 
exec('insert  into  #tmpA  (bh,'+@gzlb+')  select  bh,je  from  tblA  where  gzlb='''+@gzlb+'''')   
SQL语句实现横排 
SQL语句实现横排 
select  @sqlstr=@sqlstr+',sum(isnull('+@gzlb+',0)) as '+ @gzlb   
SQL语句实现横排  
SQL语句实现横排 
fetch  next  from  @cgzlb  into  @gzlb   
SQL语句实现横排
end     
SQL语句实现横排
close  @cgzlb   
SQL语句实现横排
deallocate  @cgzlb   
SQL语句实现横排 
SQL语句实现横排
set  @sqlstr=@sqlstr+'  from  #tmpA  group  by  bh  order  by  bh   '
SQL语句实现横排
print @sqlstr
SQL语句实现横排
execute(@sqlstr)   
SQL语句实现横排 
SQL语句实现横排
drop table #tmpA
SQL语句实现横排

执行结果如图:
SQL语句实现横排

相关文章: