天天看点

[sql server] 字段合并

实际贴:

http://topic.csdn.net/u/20100720/10/c0b95705-308b-4ef4-b086-77b0c4c04522.html

http://topic.csdn.net/u/20100802/14/8be14ec7-e560-4541-9d06-0a1a9bec17b7.html

 --建立测试环境

IF OBJECT_ID('tb') IS NOT NULL  DROP TABLE tb

GO

CREATE TABLE tb

(

 id int identity,

 houseName varchar(10),

 proid int,

    procount int

)

GO

INSERT TB

SELECT 'A仓库',1,100 union all

SELECT 'A仓库',2,50 union all

SELECT 'B仓库',1,60 union all

SELECT 'B仓库',2,70

--查询

--1

IF OBJECT_ID('f_getproid') IS NOT NULL  DROP function f_getproid

GO

create function f_getproid (@houseName varchar(10))

returns varchar(50)

as

begin

declare @s varchar(50)

select @s=isnull(@s+',','')+ltrim(proid) from tb where [email protected]

return @s

end

go

IF OBJECT_ID('f_getprocount') IS NOT NULL  DROP function f_getprocount

GO

create function f_getprocount (@houseName varchar(10))

returns varchar(50)

as

begin

declare @s varchar(50)

select @s=isnull(@s+',','')+ltrim(procount) from tb where [email protected]

return @s

end

go

select houseName,dbo.f_getproid(houseName)proid,dbo.f_getprocount(houseName)procount from tb group by houseName

go

--2

select houseName,

stuff((select ','+ltrim(proid) from tb where houseName=t.houseName for xml path('')),1,1,'') proid,

stuff((select ','+ltrim(procount) from tb where houseName=t.houseName for xml path('')),1,1,'') procount

from tb t

group by houseName

--结果

--1、sql2000中只能用自定义的函数解决

create table tb(id int, value varchar(10))

insert into tb values(1, 'aa')

insert into tb values(1, 'bb')

insert into tb values(2, 'aaa')

insert into tb values(2, 'bbb')

insert into tb values(2, 'ccc')

go

create function dbo.f_str(@id int) returns varchar(100)

as

begin

    declare @str varchar(1000)

    set @str = ''

    select @str = @str + ',' + cast(value as varchar) from tb where id = @id

    set @str = right(@str , len(@str) - 1)

    return @str

end

go

--调用函数

select id , value = dbo.f_str(id) from tb group by id

drop function dbo.f_str

drop table tb

--2、sql2005中的方法

create table tb(id int, value varchar(10))

insert into tb values(1, 'aa')

insert into tb values(1, 'bb')

insert into tb values(2, 'aaa')

insert into tb values(2, 'bbb')

insert into tb values(2, 'ccc')

go

select id, [value] = stuff((select ',' + [value] from tb t where id = tb.id for xml path('')) , 1 , 1 , '')

from tb

group by id

drop table tb

--3、使用游标合并数据

create table tb(id int, value varchar(10))

insert into tb values(1, 'aa')

insert into tb values(1, 'bb')

insert into tb values(2, 'aaa')

insert into tb values(2, 'bbb')

insert into tb values(2, 'ccc')

go

declare @t table(id int,value varchar(100))--定义结果集表变量

--定义游标并进行合并处理

declare my_cursor cursor local for

select id , value from tb

declare @id_old int , @id int , @value varchar(10) , @s varchar(100)

open my_cursor

fetch my_cursor into @id , @value

select @id_old = @id , @s=''

while @@FETCH_STATUS = 0

begin

    if @id = @id_old

       select @s = @s + ',' + cast(@value as varchar)

    else

      begin

        insert @t values(@id_old , stuff(@s,1,1,''))

        select @s = ',' + cast(@value as varchar) , @id_old = @id

      end

    fetch my_cursor into @id , @value

END

insert @t values(@id_old , stuff(@s,1,1,''))

close my_cursor

deallocate my_cursor

select * from @t

drop table tb

继续阅读