-- =============================================================================
-- 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)
*/

最新文章

  1. 如何理解T-SQL中Merge语句
  2. webapp启动流程
  3. Linux下rz命令使用的实例详解
  4. scanf的一些技巧
  5. chrome web开发工具
  6. iOS之设置状态栏颜色
  7. kswapd0、kjournald、pdflush、kblocked、migration进程含义 转
  8. [分享]我的LABVIEW快速开发串口测试软件实例
  9. 解决eclipse无法解析shared_ptr
  10. How To Use Linux epoll with Python
  11. zookeeper web ui--&amp;gt;node-zk-browser安装
  12. PyTorch官方中文文档:torch
  13. InfluxDB——python使用手册
  14. linux tee
  15. Python基础-if判断以及其他循环
  16. 【LibreOJ】#6395. 「THUPC2018」城市地铁规划 / City 背包DP+Prufer序
  17. C#下实现的基础K-MEANS多维聚类
  18. 1001 A+B Format (20 分)
  19. JVM内存区域划分Eden Space、Survivor Space、Tenured Gen,Perm Gen解释 (生动形象)
  20. dorado 的学习位置、控件使用方法查找、示例演示地址

热门文章

  1. Sed 命令详解 正则表达式元字符
  2. Selenium-js弹窗浮层
  3. web前端绘制0.5像素的几种方法
  4. android之VideoView和视频播放View的扩展
  5. Android之setContentView和LayoutInflater
  6. [转]javascript单元测试
  7. rsync 介绍和参数说明
  8. 【转】 Pro Android学习笔记(三八):Fragment(3):基础小例子-续
  9. python 基础 操作文件和目录
  10. IOS+openCV在Xcode的入门开发