SQL SERVER:在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 @   毛小毛  阅读(629)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示