SQL SERVER将多行数据合并成一行(转载)
昨天遇到一个SQL Server的问题:需要写一个储存过程来处理几个表中的数据,最后问题出在我想将一个表的一个列的多行内容拼接成一行
比如表中有两列数据 :
ep_classes ep_name
AAA 企业1
AAA 企业2
AAA 企业3
BBB 企业4
BBB 企业5
我想把这个表变成如下格式:
ep_classes ep_name
AAA 企业1,企业2,企业3
BBB 企业4,企业5
一开始挺头疼的(会了的肯定没有这种感觉,不会那必须是头疼啊(*^__^*) ),从网上找了点资料,算是找到一种比较简单方便的方法吧,现在大体总结一下,供大家共同学习。
原先的表名为:ep_detail。
实现代码如下:
select ep_classes, ep_name = (stuff((select ',' + ep_name from ep_detail where ep_classes = a.ep_classes for xml path('')),1,1,'')) from ep_detail a group by ep_classes
这里使用了SQL Server 2005版本以后加入的stuff以及for xml path,先说下在上面这句sql中的作用,然后再详细的说明一下这两个的用法。
for xml path('')
这句是把拼接的内容的第一个“,”去掉。
好了,现在开始具体说一下用法:
①stuff:
1、作用
stuff(param1, startIndex, length, param2)
将param1中自startIndex(SQL中都是从1开始,而非0)起,删除length个字符,然后用param2替换删掉的字符。
2、参数
param1
一个字符数据表达式。param1可以是常量、变量,也可以是字符列或二进制数据列。
startIndex
一个整数值,指定删除和插入的开始位置。如果 startIndex或 length 为负,则返回空字符串。如果startIndex比param1长,则返回空字符串。startIndex可以是 bigint 类型。
length
一个整数,指定要删除的字符数。如果 length 比param1长,则最多删除到param1 中的最后一个字符。length 可以是 bigint 类型。
3、返回类型
如果param1是受支持的字符数据类型,则返回字符数据。如果param1是一个受支持的 binary 数据类型,则返回二进制数据。
4、备注
如果结果值大于返回类型支持的最大值,则产生错误。
eg:
select STUFF('abcdefg',1,0,'1234') --结果为'1234abcdefg' select STUFF('abcdefg',1,1,'1234') --结果为'1234bcdefg' select STUFF('abcdefg',2,1,'1234') --结果为'a1234cdefg' select STUFF('abcdefg',2,2,'1234') --结果为'a1234defg'
通过以上4个小例子,应该能明白stuff的用法了。
②for xml path:
for xml path有的人可能知道有的人可能不知道,其实它就是将查询结果集以XML形式展现,有了它我们可以简化我们的查询语句实现一些以前可能需要借助函数活存储过程来完成的工作。那么以一个实例为主.
我们还是通过列子引入:
假设有个表存放着学生的选课情况(stu_courses):
接下来我们来看应用FOR XML PATH的查询结果语句如下:
select stu_name,stu_course from stu_courses for xml path;
结果如下:
<row><stu_name>张三</stu_name><stu_course>数学</stu_course> </row> <row><stu_name>张三</stu_name><stu_course>语文</stu_course> </row> <row><stu_name>张三</stu_name><stu_course>英语</stu_course> </row> <row><stu_name>李四</stu_name><stu_course>数学</stu_course> </row> <row><stu_name>李四</stu_name><stu_course>语文</stu_course> </row>
由此可以看出 FOR XML PATH 可以将查询结果根据行输出成XML各式!而且我们还可以改变XML行节点的名称,代码如下:
select stu_name,stu_course from stu_courses for xml path('course');
看显示结果,原来的行节点<row> 变成了我们在PATH后面括号()中自定义的名称<course>:
<course><stu_name>张三</stu_name><stu_course>数学</stu_course> </course> <course><stu_name>张三</stu_name><stu_course>语文</stu_course> </course> <course><stu_name>张三</stu_name><stu_course>英语</stu_course> </course> <course><stu_name>李四</stu_name><stu_course>数学</stu_course> </course> <course><stu_name>李四</stu_name><stu_course>语文</stu_course> </course>
其实我们还可以改变列节点,还记的给列起别名的关键字AS吗?就是用它!代码如下:
select stu_name as MyName,stu_course as MyCourse from stu_courses for xml path('course');
显示结果:
<course><MyName>张三</MyName><MyCourse>数学</MyCourse> </course> <course><MyName>张三</MyName><MyCourse>语文</MyCourse> </course> <course><MyName>张三</MyName><MyCourse>英语</MyCourse> </course> <course><MyName>李四</MyName><MyCourse>数学</MyCourse> </course> <course><MyName>李四</MyName><MyCourse>语文</MyCourse> </course>
我们还可以构建我们喜欢的输出方式,看代码
select '['+stu_name+','+stu_course+']' from stu_courses for xml path('');
显示结果
1
|
[张三,数学][张三,语文][张三,英语][李四,数学][李四,语文]
|
转载于:https://www.cnblogs.com/tianyuanmuge/p/9783107.html
SQL SERVER将多行数据合并成一行(转载)相关推荐
- SQL SERVER将多行数据合并成一行
1)比如表中有三列数据: 2)执行如下查询: SELECT [USERNAME], [USERACCOUNT], [ROLENAME] = stuff((SELECT ',' + [ROLENAME] ...
- 各数据库SQL查询结果多行数据合并成一行
SQL查询结果多行数据合并成一行 一.Oracle函数多行数据合并成一行 二.Mysql函数多行数据合并成一行 三.sqlserver函数多行数据合并成一行 四.postgresql函数多行数据合并成 ...
- sqlserver函数多行数据合并成一行
sqlserver函数多行数据合并成一行 SELECTusername,coursename= (STUFF((SELECT ',' + coursenameFROM t_user_courseWHE ...
- java 合并到一行_mysql中将多行数据合并成一行数据
一个字段可能对应多条数据,用mysql实现将多行数据合并成一行数据 例如:一个活动id(activeId)对应多个模块名(modelName),按照一般的sql语句: 1 SELECT am.acti ...
- mysql大量数据合并_mysql中将多行数据合并成一行数据
一个字段可能对应多条数据,用mysql实现将多行数据合并成一行数据 例如:一个活动id(activeId)对应多个模块名(modelName),按照一般的sql语句: 1 SELECT am.acti ...
- mysql把相同id的多行合并到一行_mysql中将多行数据合并成一行数据
一个字段可能对应多条数据,用mysql实现将多行数据合并成一行数据 例如:一个活动id(activeId)对应多个模块名(modelName),按照一般的sql语句: 1 SELECT am.acti ...
- python如何输入多行数据合并_Python如何将多行数据合并成一行|python如何实现excle数据合并...
用Python导出工程文件两个子页里的数据成为两个excel表格,但我想把它合并成个一个excel表格的两个sheet 可以采用一些Excel的模块去实现,比如xlrd.xlwt.openpyxl.x ...
- Oracle多行数据合并成一行
Oracle多行数据合并成一行 一.listagg 函数------(有长度限制) SELECT listagg(待拼接字段, ',') within group(ORDER BY 待拼接字段) AS ...
- java 合并到一行_GROUP_CONCAT() 多行数据合并成一行
MySQL多选数据合并成为一行--GROUP_CONCAT() 当数据中出现一对多,且需要把多的数据转换为一,形成一对一的数据形式. 此时,可以通过程序实现,也可以通过sql直接实现.此处采取SQL方 ...
最新文章
- hessiancpp编译和使用(C++版)
- BIEE物理业务层编辑之后发布路径
- url 参数 后台 加密_一套拿来即用的后台管理系统,非常方便(附项目地址)
- Postgresql 物理热备份 -- 快照备份
- 天合公司 TRW Inc.
- H3 BPM报销流程开发示例
- 走近互联网先驱者——Henning Schulzrinne
- aix Mysql-Rpm puppet puppetAgent
- 你们知道内卷化最严重的地方是哪里吗?
- Loadrunner之-VirtualUserGenerator录制web程序脚本
- SFTP连接服务器后,PWD显示的目录、是用户的home目录
- 引入其他字体库 和 字体样式设置
- 虚短虚断是怎么来的?长篇好文介绍深度负反馈
- K线形态识别—K线反转形态之底部反转形态
- android qq音乐无法连接网络连接,qq音乐不能播放_qq音乐为什么老是提示说歌曲无效或网络连接失败呢?...
- 802.11--802.11ac协议
- C++中的枚举(enum)
- html视频怎么改大小,视频画面尺寸重置-视频画面大小调整的方法哪个好,视频尺寸怎么修改...
- Cmpp发送wappush
- Maven基础(2):Maven详解
热门文章
- android8按键布局,机身按键接口布局合理_手机Android频道-中关村在线
- es查询大文本效率_【搜索引擎】 4-ES在大数据量下提高查询效率方案
- arp协议的主要功能是_计算机网络之ARP协议
- 在java中将String转int
- 计算两个日期之间的时间差(毫秒数)
- This application is only supported on Windows 8.1, Windows Server 2012 R2, or hi gher.
- mysql 连接错误The server time zone value ‘?????????‘
- Eureka 客户端不注册
- 新微擎 v1.7.9 图文回复 标题emoji
- 實用 SMTP 指令