SQL中合并多行记录的方法总汇

-- =============================================================================
--
 Title: 在SQL中分类合并数据行
--
 Author: dobear        Mail(MSN): dobear_0922@hotmail.com
--
 Environment: Vista + SQL2005
--
 Date: 2008-04-22
--
 =============================================================================

--1. 创建表,添加测试数据
CREATE TABLE tb(id int[value] varchar(10))
INSERT tb SELECT 1'aa'
UNION ALL SELECT 1'bb'
UNION ALL SELECT 2'aaa'
UNION ALL SELECT 2'bbb'
UNION ALL SELECT 2'ccc'

--SELECT * FROM tb
/*
id          value
----------- ----------
1           aa
1           bb
2           aaa
2           bbb
2           ccc

(5 row(s) affected)
*/



--2 在SQL2000只能用自定义函数实现
--
--2.1 创建合并函数fn_strSum,根据id合并value值
GO
CREATE FUNCTION dbo.fn_strSum(@id int)
RETURNS varchar(8000)
AS
BEGIN
    
DECLARE @values varchar(8000)
    
SET @values = ''
    
SELECT @values = @values + ',' + value FROM tb WHERE id=@id
    
RETURN STUFF(@values11'')
END
GO

-- 调用函数
SELECT id, VALUE = dbo.fn_strSum(id) FROM tb GROUP BY id
DROP FUNCTION dbo.fn_strSum

----2.2 创建合并函数fn_strSum2,根据id合并value值
GO
CREATE FUNCTION dbo.fn_strSum2(@id int)
RETURNS varchar(8000)
AS
BEGIN
    
DECLARE @values varchar(8000)    
    
SELECT @values = isnull(@values + ','''+ value FROM tb WHERE id=@id
    
RETURN @values
END
GO

-- 调用函数
SELECT id, VALUE = dbo.fn_strSum2(id) FROM tb GROUP BY id
DROP FUNCTION dbo.fn_strSum2


--3 在SQL2005中的新解法
--
--3.1 使用OUTER APPLY
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="'','), '"/>'''), 11'')
)N

----3.2 使用XML
SELECT id, [values]=STUFF((SELECT ','+[value] FROM tb t WHERE id=tb.id FOR XML PATH('')), 11'')
FROM tb
GROUP BY id

--4 删除测试表tb
drop table tb

/*
id          values
----------- --------------------
1           aa,bb
2           aaa,bbb,ccc

(2 row(s) affected)
*/

posted @ 2013-07-25 09:22  许志伟  阅读(520)  评论(0编辑  收藏  举报