SQL SERVER 中将重复记录合并为一条记录
2012-05-30 14:09
344 查看
合并列值
原著:邹建
改编:爱新觉罗.毓华 2007-12-16 广东深圳
表结构,数据如下:
id value
----- ------
1 aa
1 bb
2 aaa
2 bbb
2 ccc
需要得到结果:
id values
------ -----------
1 aa,bb
2 aaa,bbb,ccc
即:groupby id, 求 value 的和(字符串相加)
1. 旧的解决方法(在sql server 2000中只能用函数解决。)
--1. 创建处理函数
createtable tb(id int, value varchar(10))
insertinto tb values(1, 'aa')
insertinto tb values(1, 'bb')
insertinto tb values(2, 'aaa')
insertinto tb values(2, 'bbb')
insertinto tb values(2, 'ccc')
go
CREATEFUNCTION dbo.f_str(@idint)
RETURNSvarchar(8000)
AS
BEGIN
DECLARE@rvarchar(8000)
SET@r=''
SELECT@r=@r+','+ value FROM tb WHERE id=@id
RETURNSTUFF(@r, 1, 1, '')
END
GO
-- 调用函数
SELECt id, value = dbo.f_str(id) FROM tb GROUPBY id
droptable tb
dropfunction dbo.f_str
/*
id value
----------- -----------
1 aa,bb
2 aaa,bbb,ccc
(所影响的行数为 2 行)
*/
--2、另外一种函数.
createtable tb(id int, value varchar(10))
insertinto tb values(1, 'aa')
insertinto tb values(1, 'bb')
insertinto tb values(2, 'aaa')
insertinto tb values(2, 'bbb')
insertinto tb values(2, 'ccc')
go
--创建一个合并的函数
createfunction f_hb(@idint)
returnsvarchar(8000)
as
begin
declare@strvarchar(8000)
set@str=''
select@str=@str+','+cast(value asvarchar) from tb where id =@id
set@str=right(@str , len(@str) -1)
return(@str)
End
go
--调用自定义函数得到结果:
selectdistinct id ,dbo.f_hb(id) as value from tb
droptable tb
dropfunction dbo.f_hb
/*
id value
----------- -----------
1 aa,bb
2 aaa,bbb,ccc
(所影响的行数为 2 行)
*/
2. 新的解决方法(在sql server 2005中用OUTER APPLY等解决。)
createtable tb(id int, value varchar(10))
insertinto tb values(1, 'aa')
insertinto tb values(1, 'bb')
insertinto tb values(2, 'aaa')
insertinto tb values(2, 'bbb')
insertinto tb values(2, 'ccc')
go
-- 查询处理
droptable tb
/*
id values
----------- -----------
1 aa,bb
2 aaa,bbb,ccc
(2 行受影响)
*/
原著:邹建
改编:爱新觉罗.毓华 2007-12-16 广东深圳
表结构,数据如下:
id value
----- ------
1 aa
1 bb
2 aaa
2 bbb
2 ccc
需要得到结果:
id values
------ -----------
1 aa,bb
2 aaa,bbb,ccc
即:groupby id, 求 value 的和(字符串相加)
1. 旧的解决方法(在sql server 2000中只能用函数解决。)
--1. 创建处理函数
createtable tb(id int, value varchar(10))
insertinto tb values(1, 'aa')
insertinto tb values(1, 'bb')
insertinto tb values(2, 'aaa')
insertinto tb values(2, 'bbb')
insertinto tb values(2, 'ccc')
go
CREATEFUNCTION dbo.f_str(@idint)
RETURNSvarchar(8000)
AS
BEGIN
DECLARE@rvarchar(8000)
SET@r=''
SELECT@r=@r+','+ value FROM tb WHERE id=@id
RETURNSTUFF(@r, 1, 1, '')
END
GO
-- 调用函数
SELECt id, value = dbo.f_str(id) FROM tb GROUPBY id
droptable tb
dropfunction dbo.f_str
/*
id value
----------- -----------
1 aa,bb
2 aaa,bbb,ccc
(所影响的行数为 2 行)
*/
--2、另外一种函数.
createtable tb(id int, value varchar(10))
insertinto tb values(1, 'aa')
insertinto tb values(1, 'bb')
insertinto tb values(2, 'aaa')
insertinto tb values(2, 'bbb')
insertinto tb values(2, 'ccc')
go
--创建一个合并的函数
createfunction f_hb(@idint)
returnsvarchar(8000)
as
begin
declare@strvarchar(8000)
set@str=''
select@str=@str+','+cast(value asvarchar) from tb where id =@id
set@str=right(@str , len(@str) -1)
return(@str)
End
go
--调用自定义函数得到结果:
selectdistinct id ,dbo.f_hb(id) as value from tb
droptable tb
dropfunction dbo.f_hb
/*
id value
----------- -----------
1 aa,bb
2 aaa,bbb,ccc
(所影响的行数为 2 行)
*/
2. 新的解决方法(在sql server 2005中用OUTER APPLY等解决。)
createtable tb(id int, value varchar(10))
insertinto tb values(1, 'aa')
insertinto tb values(1, 'bb')
insertinto tb values(2, 'aaa')
insertinto tb values(2, 'bbb')
insertinto tb values(2, 'ccc')
go
-- 查询处理
SELECT * FROM(SELECT DISTINCT id FROM tb) A OUTER APPLY( SELECT[value]=STUFF(REPLACE(REPLACE( ( SELECT value FROM tb N WHERE N.id = A.id FOR XML AUTO ), '<N value="', ','), '"/>', ''), 1, 1, '') )n OUTER APPLY( SELECT[value2]=STUFF(REPLACE(REPLACE( ( SELECT value2 FROM tb N2 WHERE N2.id = A.id FOR XML AUTO ), '<N2 value2="', ','), '"/>', ''), 1, 1, '') )n2
droptable tb
/*
id values
----------- -----------
1 aa,bb
2 aaa,bbb,ccc
(2 行受影响)
*/
相关文章推荐
- Sql Server 删除重复记录,只保留一条
- sql server 删除某个字段重复的记录并留下一条记录
- SQL Server 删除重复记录,只保留一条记录
- Oracle中将一条记录(某字段中为合并的信息)拆分成多条记录
- SQL Server 删除重复记录,只保留一条记录
- Sql server 删除重复记录的SQL语句保留一条
- group_concat()函数总结(mysql数据库中将某个字段的多条记录合并成一条记录),比较实用
- 使用一条SQL语句删除表中重复记录
- 使用一条SQL语句删除表中重复记录
- oracle 当查询结果有重复记录时 选择时间最近的一条
- Oracle查询重复数据并删除,只保留一条记录
- SQL Server 如何查询最后一条记录
- mysql 删除表中的重复记录,只保留其中一条
- 删除重复记录只留下一条
- Mysql删除重复记录,保留id最小的一条
- sql 更新重复数据只取一条记录
- sql过滤掉重复记录,只保留一条数据
- SQL SERVER 删除重复记录
- 把相同的值的二维数组重装数组记录(有相同的值,合并成一条记录,这个是统计每个类别的数量)
- Mysql删除重复记录,保留id最小的一条