惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

人人都是产品经理
人人都是产品经理
aimingoo的专栏
aimingoo的专栏
Y
Y Combinator Blog
B
Blog
D
Docker
C
Check Point Blog
A
About on SuperTechFans
云风的 BLOG
云风的 BLOG
F
Fortinet All Blogs
Stack Overflow Blog
Stack Overflow Blog
Recent Announcements
Recent Announcements
MongoDB | Blog
MongoDB | Blog
WordPress大学
WordPress大学
Jina AI
Jina AI
罗磊的独立博客
月光博客
月光博客
博客园 - Franky
L
LangChain Blog
H
Help Net Security
Google DeepMind News
Google DeepMind News
Microsoft Security Blog
Microsoft Security Blog
小众软件
小众软件
T
Tailwind CSS Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻

博客园 - CrazyWill

VBscript(ASP)计算程序运行时间,精度到毫秒 VBscript(ASP)常用函数 301永久重定向实现方式及302重定向 开源搜索引擎资源 18种方法让你集中精力工作 IE的BUG - CrazyWill - 博客园 弱智的卡巴死机 bash比较文件时间和当前时间 - CrazyWill - 博客园 老问题: SQL server 2000安装过程中错误解决 使用TELNET手工操作 IMAP 查看邮件 安装 samba 记录 使用TELNET手工操作 SMTP/POP 收发邮件 SQL语句实现横排 2 世界 Web 2.0 网站评奖揭晓 MagicAjax使用简介 [链接]什么是Web 2.0——下一代软件的设计模式和商业模式 SQL语句实现合并数据(原创) WEB页面统一认证登录方法 一道有趣的C#考试题目
SQL语句实现横排
CrazyWill · 2006-02-20 · via 博客园 - CrazyWill

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

执行结果如图: