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

推荐订阅源

Y
Y Combinator Blog
S
SegmentFault 最新的问题
WordPress大学
WordPress大学
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
美团技术团队
博客园 - 叶小钗
大猫的无限游戏
大猫的无限游戏
罗磊的独立博客
Hugging Face - Blog
Hugging Face - Blog
博客园 - 司徒正美
小众软件
小众软件
博客园 - 聂微东
阮一峰的网络日志
阮一峰的网络日志
博客园 - 三生石上(FineUI控件)
月光博客
月光博客
The Cloudflare Blog
T
Tailwind CSS Blog
博客园 - 【当耐特】
Jina AI
Jina AI
量子位
有赞技术团队
有赞技术团队
博客园 - Franky
V
Visual Studio Blog
V
V2EX

博客园 - 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

执行结果如图: