复制范例代码,SQL指令执行即可。
Copy and paste to SQL command and execute.
范例一 Sample 1- -- Prepare sample data
- DECLARE @Sample TABLE (ID INT, Code VARCHAR(3))
- INSERT @Sample
- SELECT 290780, 'LT' UNION ALL
- SELECT 290780, 'AY' UNION ALL
- SELECT 290781, 'ILS' UNION ALL
- SELECT 290780, 'AY'
- -- Show the expected output
- SELECT DISTINCT s1.ID,
- STUFF((SELECT DISTINCT TOP 100 PERCENT ',' + s2.CODE FROM @Sample AS s2 WHERE s2.ID = s1.ID ORDER BY ',' + s2.CODE FOR XML PATH('')), 1, 1, '') AS CODES
- FROM @Sample AS s1
- ORDER BY s1.ID
- SELECT DISTINCT s1.ID,
- STUFF((SELECT TOP 100 PERCENT ',' + s2.CODE FROM @Sample AS s2 WHERE s2.ID = s1.ID ORDER BY ',' + s2.CODE FOR XML PATH('')), 1, 1, '') AS CODES
- FROM @Sample AS s1
- ORDER BY s1.ID
- SELECT DISTINCT s1.ID,
- STUFF((SELECT ',' + s2.CODE FROM @Sample AS s2 WHERE s2.ID = s1.ID FOR XML PATH('')), 1, 1, '') AS CODES
- FROM @Sample AS s1
- ORDER BY s1.ID
复制代码 范例二 Sample 2- --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(@values, 1, 1, '')
- 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="', ','), '"/>', ''), 1, 1, '')
- )N
- ----3.2 使用XML
- SELECT id, [values]=STUFF((SELECT ','+[value] FROM tb t WHERE id=tb.id FOR XML PATH('')), 1, 1, '')
- FROM tb
- GROUP BY id
- --4 删除测试表tb
- drop table tb
- /**//*
- id values
- ----------- --------------------
- 1 aa,bb
- 2 aaa,bbb,ccc
- (2 row(s) affected)
- */
复制代码 |
|