请教SQL字符串叠加问题

鐵蛋 2010-11-11 09:52:36
大家好!我有问题如下,现有一数据集,类似如下@a里面数据,当然实际情况不止这些,要求把Fld1字段相同的记录的Fld2字段合并起来,我现在是不愿意用游标,会很慢,不知哪位大侠知道如何写实现这个问题,给个思路,谢谢
If Exists(Select * From Tempdb..sysObjects Where id=Object_id('TempDB..#b')) Drop Table #b
Declare @a table(Fld1 VarChar(10),Fld2 VarChar(10))
Insert Into @a
Select 'a','1'
union
Select 'b','2'
union
Select 'b','3'
union
Select 'c','4'
union
Select 'c','5'
union
Select 'c','6'
union
Select 'd','7'

Select * From @a
Fld1 | Fld2
---- | ------
a | 1
b | 2
b | 3
c | 4
c | 5
c | 6
d | 7

想得到如下结果:
Fld1 | Fld2
---- | ------
a | 1
b | 2;3
c | 4;5;6
d | 7
...全文
162 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
鐵蛋 2010-11-11
  • 打赏
  • 举报
回复
不用临时表算了,ok了,谢谢大家
abuying 2010-11-11
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 xstdljj 的回复:]

现在又有个问题,我的这个数据集是在一个存储过程中间产生的临时表,在存储过程中又无法创建函数,而且函数里面也无法使用临时表,挺麻烦的
[/Quote]

你定义的表 不要用declare @a table,
改用 create table

在函数中引用表 用tempdb..#a
鐵蛋 2010-11-11
  • 打赏
  • 举报
回复
现在又有个问题,我的这个数据集是在一个存储过程中间产生的临时表,在存储过程中又无法创建函数,而且函数里面也无法使用临时表,挺麻烦的
--小F-- 2010-11-11
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 xstdljj 的回复:]
忘了说是SQL2000,没有stuff
[/Quote]
3楼 用函数
鐵蛋 2010-11-11
  • 打赏
  • 举报
回复
忘了说是SQL2000,没有stuff
--小F-- 2010-11-11
  • 打赏
  • 举报
回复
合并列值 
--*******************************************************************************************
表结构,数据如下:
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)

*/

drop table tb
fpzgm 2010-11-11
  • 打赏
  • 举报
回复

Declare @a table(Fld1 VarChar(10),Fld2 VarChar(10))
Insert Into @a
Select 'a','1'
union
Select 'b','2'
union
Select 'b','3'
union
Select 'c','4'
union
Select 'c','5'
union
Select 'c','6'
union
Select 'd','7'


select Fld1,
stuff((select ';'+Fld2 from @a where Fld1=t.Fld1 for xml path('')),1,1,'')
from @a t
group by Fld1


/*
Fld1 Fld2
------------
a 1
b 2;3
c 4;5;6
d 7

*/


fpzgm 2010-11-11
  • 打赏
  • 举报
回复
select Fld1,
stuff((select ';'+Fld2 from @a where Fld1=t.Fld1 for xml path('')),1,1,'')
from @a t
group by Fld1

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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