原文:
SQL查询语句 group by后, 字符串合并
合并列值
--*******************************************************************************************
表结构,数据如下:
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 id=
@id
RETURN STUFF(@str,
1
,
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,bbb,ccc
(所影响的行数为 2 行)
*/
--===================================================================================
2
. 新的解决方法(在sql server 2005中用OUTER APPLY等解决。)
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
*
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="
'
,
'
,
'
),
'
"/>
'
,
''
),
1
,
1
,
''
)
)N
drop table tb
/*
id values
----------- -----------
1 aa,bb
2 aaa,bbb,ccc
(2 行受影响)
*/
--
SQL2005中的方法2
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, [values]=stuff((
select
'
,
'
+[value]
from
tb t
where
id=tb.id
for
xml path(
''
)),
1
,
1
,
''
)
from
tb
group by id
/*
id values
----------- --------------------
1 aa,bb
2 aaa,bbb,ccc
(2 row(s) affected)
*/
demo:
select
BeginCity,EndCity,FanDian,
[
CangWei
]
=
stuff
((
select
'
/
'
+
[
CangWei
]
from
test1 t
where
t.BeginCity
=
Test1.BeginCity
and
t.EndCity
=
Test1.EndCity
and
t.FanDian
=
Test1.FanDian
for
xml path(
''
)),
1
,
1
,
''
)
from
Test1
group
by
BeginCity,EndCity,FanDian
参考: http://bbs.csdn.net/topics/330188225
http://bbs.csdn.net/topics/330182340

