SQL中合并多行记录的方法总汇
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中合并多行记录的方法总汇相关推荐
- SQL中怎么将行转成列?
文章目录 天天这需求就神奇!!!! SQL中怎么将行转成列? 1. 使用 CASE...WHEN...THEN 语句实现行转列,参考如下代码: 2. 使用 IF() 函数实现行转列,参考如下代码: 天 ...
- python dataframe遍历_对Python中DataFrame按照行遍历的方法
对Python中DataFrame按照行遍历的方法 在做分类模型时候,需要在DataFrame中按照行获取数据以便于进行训练和测试. import pandas as pd dict=[[1,2,3, ...
- word整个表格首行缩进_Word2016中设置首行缩进的方法
缩进决定了段落到左右页边距的距离.在Word 2016中,可以使用首行缩进.左缩进.右缩进和悬挂缩进来设置段落的缩进方式.本文介绍了Word2016中设置首行缩进的方法. 默认输入的文档内容都是顶行输 ...
- Linux中打印文件行号的方法
Linux中打印文件行号的方法 准备环境 [root@max mytest]# cat >/mytest/number.txt<<EOF > no root,no fruit ...
- VS中添加命令行参数的方法
在VS中向命令行添加参数,即向main()函数传递参数的方法: 右键单击:添加参数的工程-->属性-->配置属性-->调试,在右侧"命令参数"栏输入要添加的参数, ...
- 迷人的学霸操作!教你Python中合并字典的多种解题方法
全文共1474字,预计学习时长6分钟 图源:unsplash Python 3.9现在处于初始开发阶段,但其中让人惊喜的新功能可不少.其中一个是颠覆性的,它能使处理Python字典时编写的代码更具可读 ...
- java合并两个set_Java中合并两个集合的方法
要在JAVA中合并两个集合,代码如下所示的− 示例import java.util.stream.*; import java.util.*; import java.io.*; public cla ...
- sql查询语句中查询指定行号的方法
我们在查询一张数据表时,如果主键ID以1为种子自增长.那么我们在查询制定条数的时候非常方便,只要以ID为条件查询需要的数据即可.或者配合TOP语法也可. 但如果遇到主键不以1为自增长,且主键的数据没有 ...
- 一种快速统计SQL Server每个表行数的方法
转载自:http://www.cnblogs.com/kenyang/archive/2013/04/09/3011447.html 我们都知道用聚合函数count()可以统计表的行数.如果需要统计数 ...
最新文章
- alpha事后诸葛亮
- Elasticsearch介绍
- Caffe+UbuntuKylin14.04_X64+CUDA 6.5配置
- python 线性回归函数_Python实现的简单线性回归算法实例分析
- 每周工作4天半可行吗?人社部回应:不宜在企业中广泛推行
- SQL Server链接服务器(一台机器SQL Server登陆,同时映射登陆到另外一台远程服务器的数据库)
- 【华为云技术分享】CentOS7.4系统下,手动安装MySQL5.7的方法
- Python使用exec自动生成代码并执行,同时得到返回的变量
- 触发器与job的配合使用oracle,oracle 对象管理 10_触发器job
- sql 如何设置行级锁_如何使用SQL Server 2016行级安全性过滤和阻止数据访问
- 前端js-angluar定时刷新器
- matlab中如何用m文件,MATLAB中M文件的使用
- 慕课软件质量保证与测试(第二章.课后作业)
- 【error】error: failed to push some refs to ‘远程仓库地址‘ git报错解决
- 3 idiots的台词
- JS学习之路系列总结二阴阳阵(此文犹如武林之中的易筋经,是你驰骋IT界的武功心法,学会JS五大阵法就学会了JS,博主建议先学三才阵)...
- 创业者的噩梦 - 怎么就侵权了
- Android 交互动画的统一实践
- [转载]《博客园精华集》WF筛选结果(共39篇)
- 语雀可以导出html吗,Confluence 迁移到语雀
热门文章
- 后端:spring提供的钩子,你知道哪些?
- 科学家公布“寿命计算器”,快算一下你能活多久?
- 进程间的通信IPC(无名管道和命名管道)
- webflow_Webflow是否适合开发人员? 我的经验
- matlab中的:的优先级_内容早期设计:内容优先
- 【MySQL】redo log --- 刷入磁盘过程
- ORA-28547 连接服务器失败,可能是Oracle Net 管理错误
- 用状态机STATE MACHINE实现有选择的文件转换
- Kamp;R练习题6-1统计关键词出现的次数
- 转帖-Linux学习(Find命令使用实例)