[求教]SQL语句

雷肿么了 2010-01-13 09:30:55
表A中有如下数据:
  a 1 2
  a 2 3
  a 3 3
  b 1 2
  b 2 4
  b 5 5

 我想查询出来的结果如下:
 a 1 2 b 1 2
a 2 3 b 2 4
a 3 3 b 5 5

这个SQL要怎么写?
...全文
116 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
hunter-mym 2010-01-13
  • 打赏
  • 举报
回复
If (select object_id('test')) is not null
drop table test
go
create table test(
col1 varchar(10),
col2 int,
col3 int
)
insert into test values('A',1,2)
insert into test values('A',2,2)
insert into test values('A',3,3)
insert into test values('B',1,2)
insert into test values('B',2,4)
insert into test values('B',5,5)
insert into test values('C',1,2)
insert into test values('C',6,2)
insert into test values('C',3,3)
go
declare @sql varchar(4000),@minChar varchar(10),@max int,@i int
select @max=count(distinct col1) from test
select @minChar=min(col1) from test
select @i=0
while @i<@max
begin
select @sql='select identity(int,1,1) id,* into ' + '##temp' + char(65+@i) + ' from test ' + 'where col1=''' + char(65+@i) + ''''
Exec(@sql)
--print @sql
select @i=@i+1
select @sql=''
end
select @i=0
select @sql = 'select * from '
while @i<@max
select @sql = @sql + '##temp' + char(65+@i) + ' ' + char(65+@i) + ',',@i=@i+1
select @sql = substring(@sql,1,len(@sql)-1)
select @sql = @sql + ' where '
select @i=0
while @i<@max-1
select @sql = @sql + char(65+@i) + '.id = ' + char(66+@i) + '.id and ',@i=@i+1
select @sql = substring(@sql,1,len(@sql)-4)
--print @sql
exec(@sql)
select @i=0
select @sql=''
while @i<@max
begin
select @sql = 'drop table ##temp' + char(65+@i),@i=@i+1
exec(@sql)
end
雷肿么了 2010-01-13
  • 打赏
  • 举报
回复
先谢过了。。
dawugui 2010-01-13
  • 打赏
  • 举报
回复
create table tb(id varchar(10),px int,val int)
insert into tb values('a' , 1 , 2)
insert into tb values('a' , 2 , 3)
insert into tb values('a' , 3 , 3)
insert into tb values('b' , 1 , 2)
insert into tb values('b' , 2 , 4)
insert into tb values('b' , 5 , 5)
go

-- 如果你每个ID最多三个值。用静态SQL。
select id,
max(case px1 when 1 then val else 0 end) val1,
max(case px1 when 2 then val else 0 end) val2,
max(case px1 when 3 then val else 0 end) val3
from
(
select * , px1 = (select count(1) from tb where id = t.id and px < t.px) + 1 from tb t
) m
group by id
/*
id val1 val2 val3
---------- ----------- ----------- -----------
a 2 3 3
b 2 4 5

(所影响的行数为 2 行)
*/

-- 如果你每个ID值的个数不确定。用动态SQL。
declare @sql varchar(8000)
set @sql = 'select id '
select @sql = @sql + ' , max(case px1 when ''' + cast(px1 as varchar) + ''' then val else 0 end) [val' + cast(px1 as varchar) + ']'
from (select distinct px1 from (select * , px1 = (select count(1) from tb where id = t.id and px < t.px) + 1 from tb t)m) as a
set @sql = @sql + ' from (select * , px1 = (select count(1) from tb where id = t.id and px < t.px) + 1 from tb t) m group by id'
exec(@sql)
/*
id val1 val2 val3
---------- ----------- ----------- -----------
a 2 3 3
b 2 4 5
*/

drop table tb
daishaodong 2010-01-13
  • 打赏
  • 举报
回复
用临时表吧,先带a的into到临时表,把带b的into到临时表,。。。。
最后select临时表,多表联查。。
dawugui 2010-01-13
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 z307755214 的回复:]
引用 7 楼 dawugui 的回复:
引用 6 楼 z307755214 的回复:
上面弄错了。。
  a  1  2    b  1  2  c  1  2    d . .
  a  2  3    b  2  4  c  .  .    d . .
  a  3  3    b  5  5  c  .  .

难办,帮顶


你都说难办了,看来思路得改,要改道了。。
[/Quote]
我建议你这样横起来显示,反正你每个ID最多三个?(或多个也无所谓)

id val1 val2 val3...
a 2 3 3
b 2 4 5

如果这样,就可以使用静(动态)行列转换。
lang071234 2010-01-13
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 z307755214 的回复:]
引用 7 楼 dawugui 的回复:
引用 6 楼 z307755214 的回复:
上面弄错了。。
  a  1  2    b  1  2  c  1  2    d . .
  a  2  3    b  2  4  c  .  .    d . .
  a  3  3    b  5  5  c  .  .

难办,帮顶


你都说难办了,看来思路得改,要改道了。。
[/Quote]
·
雷肿么了 2010-01-13
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 dawugui 的回复:]
引用 6 楼 z307755214 的回复:
上面弄错了。。
  a  1  2    b  1  2  c  1  2    d . .
  a  2  3    b  2  4  c  .  .    d . .
  a  3  3    b  5  5  c  .  .

难办,帮顶
[/Quote]

你都说难办了,看来思路得改,要改道了。。
dawugui 2010-01-13
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 z307755214 的回复:]
上面弄错了。。
  a  1  2    b  1  2  c  1  2    d . .
  a  2  3    b  2  4  c  .  .    d . .
  a  3  3    b  5  5  c  .  .
[/Quote]
难办,帮顶
雷肿么了 2010-01-13
  • 打赏
  • 举报
回复
上面弄错了。。
a 1 2 b 1 2 c 1 2 d . .
a 2 3 b 2 4 c . . d . .
a 3 3 b 5 5 c . .
雷肿么了 2010-01-13
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 sql77 的回复:]
要是还有C的咋办,

[/Quote]

有c 的
 a 1 2 b 1 2
a 2 3 b 2 4
a 3 3 b 5 5
c ...............
c ...............
andysun88 2010-01-13
  • 打赏
  • 举报
回复
需求还能明白一些吗?
lidanzi 2010-01-13
  • 打赏
  • 举报
回复
你这连接没啥规律的?
SQL77 2010-01-13
  • 打赏
  • 举报
回复
要是还有C的咋办,
jwdream2008 2010-01-13
  • 打赏
  • 举报
回复
Up!

22,295

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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