SQL语句实现横排?(转帖)

时间:2021-06-02 10:30:44
  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...)  
 
---------------------------------------------------------------  
 
if  exists(select  name  from  sysobjects  where  name='tblA'  and  xtype='U')  
     drop  table  tblA  
 
create  table  tblA(  
   BH  char(3)  not  null,  
   GZLB  varchar(3)  not  null,  
   JE  int  not  null  
)  
go  
 
insert  tblA  values('001',            'A',              100)  
insert  tblA  values('001',            'B',              150)  
insert  tblA  values('001',            'C',              110)  
insert  tblA  values('002',            'A',              99)  
insert  tblA  values('002',            'B',              180)  
insert  tblA  values('002',            'C',              150)  
insert  tblA  values('003',            'A',              160)  
insert  tblA  values('003',            'B',              170)  
insert  tblA  values('003',            'C',              130)  
 
   declare  @sql  varchar(600)  
   set  @sql  =  'select'  
   select  distinct  GZLB  as  'GZLB'  into  tmp  from  tblA  
     
     
   select  @sql  =  @sql  +'  max(case  GZLB  when  '''+  GZLB  +'''  then  JE  else  null  end)  as  '''+  GZLB  +''','  from  tmp  
   set  @sql  =  substring(@sql,  1,  len(@sql)-1)  +'  from  tblA  group  by  BH'  
   exec(@sql)  
---------------------------------------------------------------  
 
用游标  
declare  @sqlstr  varchar(2000)  
declare  @gzlb  
select  sqlstr='select  bh'  
declare  cgzlb  cursor  for  select  gzlb  from  table  
create  table  #a  
(bh  char(3))  
open  cgzlb  
fetch  next  from  cgzlb  into  @gzlb  
while  (fetch_status<>-1)  
begin  
exec('alter  table  #a  add  '+@gzlb  +'  char(1)')  
exec('insert  into  #a  (bh,'+@gzlb+'    select  bh,je  from  table  where  gzlb='''+@gzlb+'''')  
select  @sqlstr=@sqlstr+',sum(isnull('+@gzlb+'))'  
 
 
fetch  next  from  cgzlb  into  @gzlb  
end    
close  cgzlb  
deallocate  cgzlb  
select  @sqlstr=@sqlstr+'  from  #a  group  by  bh  order  by  bh  
execute(@sqlstr)  
 
---------------------------------------------------------------  
 
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)