SQL中合并多行记录的方法总汇

——前几天还在抱怨:sql只有sum(数值),不能sum(字符串)

——如果不是分组统计,用select @values = @values + ',' + value也是可以的
——但是如果是分组sum(字符串),肯定不行了!
——下面是用函数实现的分组sum(字符串),只是比较“死”:表名、分组依据、待累加的字符串字段都需要预先写死!

http://blog.csdn.net/dobear_0922/archive/2008/04/22/2313839.aspx
 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(@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)
*/

转载于:https://www.cnblogs.com/veigd/archive/2009/04/13/1435003.html

SQL中合并多行记录的方法总汇相关推荐

  1. SQL中怎么将行转成列?

    文章目录 天天这需求就神奇!!!! SQL中怎么将行转成列? 1. 使用 CASE...WHEN...THEN 语句实现行转列,参考如下代码: 2. 使用 IF() 函数实现行转列,参考如下代码: 天 ...

  2. python dataframe遍历_对Python中DataFrame按照行遍历的方法

    对Python中DataFrame按照行遍历的方法 在做分类模型时候,需要在DataFrame中按照行获取数据以便于进行训练和测试. import pandas as pd dict=[[1,2,3, ...

  3. word整个表格首行缩进_Word2016中设置首行缩进的方法

    缩进决定了段落到左右页边距的距离.在Word 2016中,可以使用首行缩进.左缩进.右缩进和悬挂缩进来设置段落的缩进方式.本文介绍了Word2016中设置首行缩进的方法. 默认输入的文档内容都是顶行输 ...

  4. Linux中打印文件行号的方法

    Linux中打印文件行号的方法 准备环境 [root@max mytest]# cat >/mytest/number.txt<<EOF > no root,no fruit ...

  5. VS中添加命令行参数的方法

    在VS中向命令行添加参数,即向main()函数传递参数的方法: 右键单击:添加参数的工程-->属性-->配置属性-->调试,在右侧"命令参数"栏输入要添加的参数, ...

  6. 迷人的学霸操作!教你Python中合并字典的多种解题方法

    全文共1474字,预计学习时长6分钟 图源:unsplash Python 3.9现在处于初始开发阶段,但其中让人惊喜的新功能可不少.其中一个是颠覆性的,它能使处理Python字典时编写的代码更具可读 ...

  7. java合并两个set_Java中合并两个集合的方法

    要在JAVA中合并两个集合,代码如下所示的− 示例import java.util.stream.*; import java.util.*; import java.io.*; public cla ...

  8. sql查询语句中查询指定行号的方法

    我们在查询一张数据表时,如果主键ID以1为种子自增长.那么我们在查询制定条数的时候非常方便,只要以ID为条件查询需要的数据即可.或者配合TOP语法也可. 但如果遇到主键不以1为自增长,且主键的数据没有 ...

  9. 一种快速统计SQL Server每个表行数的方法

    转载自:http://www.cnblogs.com/kenyang/archive/2013/04/09/3011447.html 我们都知道用聚合函数count()可以统计表的行数.如果需要统计数 ...

最新文章

  1. alpha事后诸葛亮
  2. Elasticsearch介绍
  3. Caffe+UbuntuKylin14.04_X64+CUDA 6.5配置
  4. python 线性回归函数_Python实现的简单线性回归算法实例分析
  5. 每周工作4天半可行吗?人社部回应:不宜在企业中广泛推行
  6. SQL Server链接服务器(一台机器SQL Server登陆,同时映射登陆到另外一台远程服务器的数据库)
  7. 【华为云技术分享】CentOS7.4系统下,手动安装MySQL5.7的方法
  8. Python使用exec自动生成代码并执行,同时得到返回的变量
  9. 触发器与job的配合使用oracle,oracle 对象管理 10_触发器job
  10. sql 如何设置行级锁_如何使用SQL Server 2016行级安全性过滤和阻止数据访问
  11. 前端js-angluar定时刷新器
  12. matlab中如何用m文件,MATLAB中M文件的使用
  13. 慕课软件质量保证与测试(第二章.课后作业)
  14. 【error】error: failed to push some refs to ‘远程仓库地址‘ git报错解决
  15. 3 idiots的台词
  16. JS学习之路系列总结二阴阳阵(此文犹如武林之中的易筋经,是你驰骋IT界的武功心法,学会JS五大阵法就学会了JS,博主建议先学三才阵)...
  17. 创业者的噩梦 - 怎么就侵权了
  18. Android 交互动画的统一实践
  19. [转载]《博客园精华集》WF筛选结果(共39篇)
  20. 语雀可以导出html吗,Confluence 迁移到语雀

热门文章

  1. 后端:spring提供的钩子,你知道哪些?
  2. 科学家公布“寿命计算器”,快算一下你能活多久?
  3. 进程间的通信IPC(无名管道和命名管道)
  4. webflow_Webflow是否适合开发人员? 我的经验
  5. matlab中的:的优先级_内容早期设计:内容优先
  6. 【MySQL】redo log --- 刷入磁盘过程
  7. ORA-28547 连接服务器失败,可能是Oracle Net 管理错误
  8. 用状态机STATE MACHINE实现有选择的文件转换
  9. Kamp;R练习题6-1统计关键词出现的次数
  10. 转帖-Linux学习(Find命令使用实例)