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

  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)  

转载于:https://www.cnblogs.com/3zfp/archive/2004/12/19/79084.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值