请教一个复杂的SQL语句!

bqj 2003-06-16 08:39:42
如下表的数据
1 10
2 15
3 16
...
31 13

如何用一个SQL语句提到如下结果
1 2 3 ... 31
10 15 16 ... 13
...全文
37 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
星星 2003-06-22
  • 打赏
  • 举报
回复
这不是纵向转横向吗?
我一般都用 pengdali(大力 V2.0) 的方法!
不知道还有没其他办法!(仅限SQL处理)
bqj 2003-06-22
  • 打赏
  • 举报
回复
谢谢大家!

这样就可以了:

begin tran
create table tb(id int,value int)
insert into tb(id,value) values(1,10)
insert into tb(id,value) values(2,110)
insert into tb(id,value) values(3,120)
insert into tb(id,value) values(4,140)
insert into tb(id,value) values(5,160)
insert into tb(id,value) values(6,170)
insert into tb(id,value) values(7,104)
insert into tb(id,value) values(8,124)
insert into tb(id,value) values(9,114)
insert into tb(id,value) values(10,104)
insert into tb(id,value) values(11,123)
insert into tb(id,value) values(12,134)
insert into tb(id,value) values(13,121)
insert into tb(id,value) values(14,100)

declare @sql varchar(2000),@fdname varchar(10)
select @sql=''
declare #aa cursor for select distinct id from tb
open #aa
fetch next from #aa into @fdname
while @@fetch_status=0
begin
select @sql=@sql+',sum(case when id=' +cast(@fdname as varchar)+' then value end) as ['+@fdname+']'
fetch next from #aa into @fdname
end
close #aa
deallocate #aa
select @sql='select '+right(@sql,len(@sql)-1)+' from tb'
print @sql
exec(@sql)
rollback tran
bqj 2003-06-22
  • 打赏
  • 举报
回复
zjcxc(邹建)
你这个代码的排序是这样的:
1 10 11 12 2 3 4 5 6 7 8 9 ...
可不可以改为如下排序
1 2 3 4 5 6 7 8 9 10 11 ...
wynbfqny 2003-06-21
  • 打赏
  • 举报
回复
谢谢 zjcxc(邹建)
zjcxc 元老 2003-06-21
  • 打赏
  • 举报
回复
把它改成存储过程,然后在VB中调用这个存储过程就行了.
create procedure aa
as
set nocount on
declare @sql varchar(2000),@fdname varchar(10)
select @sql=''
declare #aa cursor for select distinct cast(id as varchar) from tb
open #aa
fetch next from #aa into @fdname
while @@fetch_status=0
begin
select @sql=@sql+',sum(case when id=' +@fdname+' then value end) as ['+@fdname+']'
fetch next from #aa into @fdname
end
close #aa
deallocate #aa
select @sql='select '+right(@sql,len(@sql)-1)+' from tb'
print @sql
exec(@sql)
set nocount off

然后在VB中,调用aa这个存储过程,就可以了.
jones129 2003-06-21
  • 打赏
  • 举报
回复
有,还在可用游标.然后用创建表和追加字段来把表转向
wynbfqny 2003-06-21
  • 打赏
  • 举报
回复
zjcxc(邹建) 能写个用vb的吗?
zjcxc 元老 2003-06-21
  • 打赏
  • 举报
回复
这个是动态生成的,你的数据增加,相应的结果变化.
zjcxc 元老 2003-06-21
  • 打赏
  • 举报
回复
begin tran
create table tb(id int,value int)
insert into tb(id,value) values(1,10)
insert into tb(id,value) values(2,110)
insert into tb(id,value) values(3,120)
insert into tb(id,value) values(4,140)
insert into tb(id,value) values(5,160)
insert into tb(id,value) values(6,170)
insert into tb(id,value) values(7,104)

declare @sql varchar(2000),@fdname varchar(10)
select @sql=''
declare #aa cursor for select distinct cast(id as varchar) from tb
open #aa
fetch next from #aa into @fdname
while @@fetch_status=0
begin
select @sql=@sql+',sum(case when id=' +@fdname+' then value end) as ['+@fdname+']'
fetch next from #aa into @fdname
end
close #aa
deallocate #aa
select @sql='select '+right(@sql,len(@sql)-1)+' from tb'
print @sql
exec(@sql)
rollback tran
bqj 2003-06-21
  • 打赏
  • 举报
回复
还有其它办法吗?
pengdali 2003-06-16
  • 打赏
  • 举报
回复
select
case when 列1=1 then 列2 end [1],
case when 列1=2 then 列2 end [2],
case when 列1=3 then 列2 end [3]
from 表
yangzhangheng_jim 2003-06-16
  • 打赏
  • 举报
回复
看一下交叉表的用法
liuyun2003 2003-06-16
  • 打赏
  • 举报
回复
gz

34,588

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧