Concanate行凭身份证像一个表

Concanate行凭身份证像一个表

问题描述:

I'm有结果:Concanate行凭身份证像一个表

enter image description here

我想要做的是有这样的结果:

enter image description here

我怎样才能这样做是因为Sybase没有连接方法?

+0

ASE不提供列表()/ GROUP_CONCAT()功能所以你必须写自己的;如果你知道你只会连接2个值,那么你可以写一个双向连接;如果你需要连接未知数的值,那么你需要编写一个游标/循环方法 – markp

+0

你有一个例子,我怎么能在这种情况下使用游标/循环方法? – Goldbones

+1

ASE中实际上有一种方法可以跨查询内部的结果集进行连接,但使用UPDATE语句的一个模糊方面(不更新任何数据,但使用变量)。为了使用循环或N路连接,重写查询可能更好(例如:“更易于理解和维护)。 – RobV

设置:

create table mytab 
(id varchar(10) 
,b varchar(30)) 
go 

insert mytab values ('233.263','DDDD') 
insert mytab values ('233.263','AAAAAQ') 
insert mytab values ('233.283','22223') 
insert mytab values ('233.283','333333') 
go 

-- #lists will hold intermediate results 
create table #lists 
(id  varchar(10) 
,b_list varchar(1000)) 
go 

宣布我们的光标:

注:OP未说明b列的值是如何进行排序,所以我们会用这个例子字母排序坚持。

declare mycur cursor 
for 
select id,b 
from mytab 
order by id,b 
for read only 
go 

循环通过光标,追加b@b_list为每个不同的id

declare @id  varchar(10), 
     @id_old varchar(10), 
     @b  varchar(30), 
     @b_list varchar(1000) 

select @id_old = NULL 

open mycur 

fetch mycur into @id, @b 

while @@sqlstatus = 0 
begin 
    -- if new @id value, save old @id/@b_list pair 
    if @id != isnull(@id_old,'UNDEFINED') 
    begin 
     if @b_list is not NULL 
     begin 
      insert #lists values (@id_old, @b_list) 
     end 

     select @id_old = @id, 
       @b_list = NULL 
    end 

    select @b_list = @b_list + case when @b_list is not NULL then '|' end + @b 

    fetch mycur into @id, @b 
end 

-- save last @id/@b_list pair 
if @b_list is not NULL 
begin 
    insert #lists values (@id, @b_list) 
end 

close mycur 

deallocate cursor mycur 
go 

显示结果:

select * from #lists 
go 

id  b_list 
------- ------------ 
233.263 AAAAAQ|DDDD 
233.283 22223|333333