SQL中合并多行记录的方法总汇
-- ============================================================================= -- Title: 在SQL中分类合并数据行
-- Title: 在SQL中分类合并数据行 -- Author: dobear        Mail(MSN): dobear_0922@hotmail.com
-- Author: dobear        Mail(MSN): dobear_0922@hotmail.com -- Environment: Vista + SQL2005
-- Environment: Vista + SQL2005 -- Date: 2008-04-22
-- Date: 2008-04-22 -- =============================================================================
-- =============================================================================
 --1. 创建表,添加测试数据
--1. 创建表,添加测试数据 CREATE TABLE tb(id int, [value] varchar(10))
CREATE TABLE tb(id int, [value] varchar(10)) INSERT tb SELECT 1, 'aa'
INSERT tb SELECT 1, 'aa' UNION ALL SELECT 1, 'bb'
UNION ALL SELECT 1, 'bb' UNION ALL SELECT 2, 'aaa'
UNION ALL SELECT 2, 'aaa' UNION ALL SELECT 2, 'bbb'
UNION ALL SELECT 2, 'bbb' UNION ALL SELECT 2, 'ccc'
UNION ALL SELECT 2, 'ccc'
 --SELECT * FROM tb
--SELECT * FROM tb /*
/* id          value
id          value ----------- ----------
----------- ---------- 1           aa
1           aa 1           bb
1           bb 2           aaa
2           aaa 2           bbb
2           bbb 2           ccc
2           ccc
 (5 row(s) affected)
(5 row(s) affected) */
*/

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

 --3 在SQL2005中的新解法
--3 在SQL2005中的新解法 ----3.1 使用OUTER APPLY
----3.1 使用OUTER APPLY SELECT *
SELECT *  FROM (SELECT DISTINCT id FROM tb) A OUTER APPLY(
FROM (SELECT DISTINCT id FROM tb) A OUTER APPLY( SELECT [values]= STUFF(REPLACE(REPLACE(
        SELECT [values]= STUFF(REPLACE(REPLACE( (
            ( SELECT value FROM tb N
                SELECT value FROM tb N WHERE id = A.id
                WHERE id = A.id FOR XML AUTO
                FOR XML AUTO ), '<N value="', ','), '"/>', ''), 1, 1, '')
            ), '<N value="', ','), '"/>', ''), 1, 1, '') )N
)N
 ----3.2 使用XML
----3.2 使用XML SELECT id, [values]=STUFF((SELECT ','+[value] FROM tb t WHERE id=tb.id FOR XML PATH('')), 1, 1, '')
SELECT id, [values]=STUFF((SELECT ','+[value] FROM tb t WHERE id=tb.id FOR XML PATH('')), 1, 1, '') FROM tb
FROM tb GROUP BY id
GROUP BY id
 --4 删除测试表tb
--4 删除测试表tb drop table tb
drop table tb
 /*
/* id          values
id          values ----------- --------------------
----------- -------------------- 1           aa,bb
1           aa,bb 2           aaa,bbb,ccc
2           aaa,bbb,ccc
 (2 row(s) affected)
(2 row(s) affected) */
*/
SQL中合并多行记录的方法总汇的更多相关文章
- MySQL把多个字段合并成一条记录的方法
		转:http://www.111cn.net/database/mysql/71591.htm MySQL把多个字段合并成一条记录的方法 在mysql中字段合并可以使用很多函数来实现,如可以利用 GR ... 
- 转载:SQL中Group By 的常见使用方法
		SQL中Group By 的常见使用方法 转载源:http://www.cnblogs.com/wang-meng/p/5373057.html 前言今天逛java吧看到了一个面试题, 于是有了今天 ... 
- Js 合并 table 行 的实现方法
		Js 合并 table 行 的实现方法 需求如下: 某公司的员工档案,如下, 经理看员工的信息不是很清晰: 姓名 所在学校 毕业时间 张三 小学 2000 张三 中学 2006 张三 大学 2010 ... 
- GridView内按钮Click获取记录主键值 在GridView控件中,每行记录内会放置一个铵钮,当用
		在GridView控件中,每行记录内会放置一个铵钮,当用户点击这个铵钮时,获取当笔记录的主键值.可看演示(是一个gif动画,重新播放尝试刷新网页): 实现这个功能,你需要为GridView控件设置Da ... 
- ORACLE PL/SQL 中序列(sequence)的简易使用方法介绍
		如果我是C罗 原文 ORACLE PL/SQL 中序列(sequence)的简易使用方法介绍 sequence在ORACLE中应用十分广泛,就是序列号的意思,会自动增加指定变数,如逐次增加1或者2或者 ... 
- 2013-06-09 12:03 如何在SQLServer中锁定某行记录
		锁的概述 一. 为什么要引入锁 多个用户同时对数据库的并发操作时会带来以下数据不一致的问题: 丢失更新 A,B两个用户读同一数据并进行修改,其中一个用户的修改结果破坏了另一个修改的结果,比如订 ... 
- 从远程oracle上导入到本地同一张表中不存在的记录的方法
		场景:在远程oracle上存在一张表A,在本地同样存在一张相同表结构的表B.由于本地表B中保存了业务系统操作产生的几条记录,同时原来导入了A中的部分记录,但是并没有保存A中全部的记录.A中有15条记录 ... 
- sql中筛选第一条记录【分组排序】
		问题描述 我们现在有一张表titles,共有4个字段,分别是emp_no(员工编号),title(职位),from_date(起始时间),to_date(结束时间),记录的是员工在某个时间段内职位名称 ... 
- Mybatis在xml配置文件中处理SQL中的大于小于号的方法
		之前在项目中遇到了在SQL中<=不识别的问题,在Navicat中语句正常,在xml中不识别,想起来就记录一下 项目用的是Mybatis,经过网上多次查询,验证,总结方法如下: 一.使用<! ... 
随机推荐
- vue-mixins使用注意事项和高级用法
			因为在项目中 mixins(混合)特性使用频率是很高的 有必要熟练掌握官方文档: mixins 实际项目中 一般都存在 列表(list) 这种很常见的使用场景 话再多都不如上demo file: mi ... 
- codeforces 631B B. Print Check
			B. Print Check time limit per test 1 second memory limit per test 256 megabytes input standard input ... 
- Struts2 - 通过实现 Aware 接口访问 Web 资源
			Action 类通过可以实现某些特定的接口, 让 Struts2 框架在运行时向 Action 实例注入 parameters, request, session 和 application 对应的 ... 
- ffmpeg代码实现自定义encoder
			1.概述 本文主要讲述如何用ffmpeg代码实现自己的encoder. 2.代码 /* *本程序主要实现一个自己的encoder并加入到encoder链中去,供api调用 *作者:缪国凯(MK) *8 ... 
- Nginx+ffmpeg的HLS开源服务器搭建配置及开发详
			本文概述: 至目前为止,HLS 是移动平台上非常重要并十分流行的流媒体传输协议.做移动平台的流媒体开发,不知道它不掌握它 ,真是一大遗憾.而HLS的平台搭建有一定的难度,本文针对对该方向有一定了解的朋 ... 
- ACM学习历程—HDU4675 GCD of Sequence(莫比乌斯)
			Description Alice is playing a game with Bob. Alice shows N integers a 1, a 2, …, a N, and M, K. She ... 
- Linux环境下,开启tomcat时报transport error 202: bind failed: 地址已在使用
			转载自:http://blog.csdn.net/mooncom/article/details/61913813 问题描述:今天我在Linux环境下配置tomcat,在tomcat/conf下的se ... 
- NSArray用法
			//类方法初始化一个数组对象 [array count] : 得到这个数组对象的长度. [array objectAtIndex index]: 传入数组的索引(index) 得到数据对象. [arr ... 
- 【转】 Pro Android学习笔记(五十):ActionBar(3):搜索条
			目录(?)[-] ActionBar中的搜索条 通过Menu item上定义search view 进行Searchable的配置 在activity中将search view关联searchable ... 
- VC 绘图,使用双缓冲技术实现
			VC 绘图,使用双缓冲技术实现 - Cloud-Datacenter-Renewable Energy-Big Data-Model - 博客频道 - CSDN.NET VC 绘图,使用双缓冲技术实现 ... 
