微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

sqlserver合并“id值相同”的列

sqlserver合并列值

合并列值
--*******************************************************************************************
表结构,数据如下:
id    value
----- ------
1    aa
1    bb
2    aaa
2    bbb
2    ccc

需要得到结果:
id    values
------ -----------
1      aa,bb
2      aaa,bbb,ccc
即:group by id,求 value 的和(字符串相加)

1. 旧的解决方法(在sql server 2000中只能用函数解决。)
--=============================================================================
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
--1. 创建处理函数
CREATE FUNCTION dbo.f_strUnite(@id int)
RETURNS varchar(8000)
AS
BEGIN
    DECLARE @str varchar(8000)
    SET @str = ''
    SELECT @str = @str + ',' + value FROM tb WHERE
    RETURN STUFF(@str,1,'')
END
GO
-- 调用函数
SELECt id,value = dbo.f_strUnite(id) FROM tb GROUP BY id
drop table tb
drop function dbo.f_strUnite
go
/*
id          value     
----------- -----------
1          aa,bb
2          aaa,ccc
(所影响的行数为 2 行)
*/
--===================================================================================
2. 新的解决方法(在sql server 2005中用OUTER APPLY等解决。)
create table tb(id int,'ccc')
go
-- 查询处理
SELECT * FROM(SELECT disTINCT id FROM tb)A OUTER APPLY(
        SELECT [values]= STUFF(REPLACE(REPLACE(
            (
                SELECT value FROM tb N
                WHERE id = A.id
                FOR XML AUTO
            ),' <N value="',','),'"/>',''),'')
)N
drop table tb

/*
id          values
----------- -----------
1          aa,ccc

(2 行受影响)
*/

--sql2005中的方法2
create table tb(id int,'ccc')
go

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

/*
id          values
----------- --------------------
1          aa,ccc

(2 row(s) affected)

*/

drop table tb

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐