--
=============================================================================
--
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
(
@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)
*/
相关文章
- SQL Server查询分组结果中第一条记录的方法
- 记一个常见的ms sql server中取第N条记录的方法
- SQL 合并多行记录的相同字段值
- Sql function 多行中的列合并为一行一列的方法
- SQL Server2008中删除重复记录的方法分享
- SQL 合并多行记录的相同字段值
- SQL中合并多行记录的方法总汇 .
- 利用ROW_NUMBER() OVER函数给SQL数据库中每一条记录分配行号的方法
- sql server 中拥有相同字段值的记录某个字段合并问题解答
- SQL 将一条记录中多个字段的值拼接为一个字段 && 将多行数据合并成一行,并且拼接CONVERT() 、for xml path、stuff的使用