SQL语句实现横排

来自:  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...)  

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

以下是两种不同实现方法,一种用游标一种不用。
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 )   

执行结果如图:
snap040.jpg

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

执行结果如图:
snap039.jpg

转载于:https://www.cnblogs.com/CrazyWill/archive/2006/02/20/334215.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值