SQL語句實現橫排

來源:互聯網
上載者:User
來自:  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...)  

先建立以上的測試資料表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(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)   

執行結果

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

執行結果

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.