SQLserver2008一对多,多行数据显示在一行
现在有一个需求
我们有一张表employee
EmpID EmpName
---------- -------------
张山
张大山
张小山
李菲菲
李晓梅
Result I need in this format: EmpID EmpName
---------- -------------
张山, 张大山, 张小山
李菲菲, 李晓梅
如果使用MySQL,可以很简单的实现
selecet group_concat(empname) from employee group by empid;
但是最近公司中使用的是SQLserver,没有group_concat的功能
最后在https://stackoverflow.com/questions/8868604/sql-group-concat-function-in-sql-server找到了答案
select distinct EmpID,
(select EmpName+‘,’
from employee t2
where t2.EmpId = t1.EmpId
For XML PATH('')
)Concatenated
from employee t1;
对于这个表是没有问题的,本以为就这样结束了,事实证明还是too young!
实际中又遇到了报错:
[Err] 22018 - [SQL Server]在将 varchar 值 ',' 转换成数据类型 int 时失败。
很快找到原因,其中一个字段的字段类型是int类型,但是在SQL语句中,我们有一个需求是对ID进行拼接,
但是我们使用了字符串(‘,’元凶在此,再加上字段类型本身是int),还是经过一番苦苦查找和分析,找到在SQLserver中有一个字符串函数stuff和convert这两个工具
STUFF字符串函数是将字符串插入到另一个字符串中。它会删除开始位置第一个字符串中的指定长度的字符,然后将第二个字符串插入到开始位置的第一个字符串中,语法如下。 STUFF(<character_expression>,<start>,<lenth>,<character_expression>)
<character_expression>参数是给定的字符串数据,可以是字符或二进制数据的常量,变量或列。
<start>参数是一个整数值,指定开始删除和插入的位置,可以是BIGINT类型。如果<开始>或<长度>参数为负数,则返回NULL字符串。
如果<start>参数比第一个<character_expression>长,则返回一个NULL字符串。
<length>参数可以是BIGINT类型,它是一个整数,指定要删除的字符数。
如果<length>比第一个<character_expression>长,则删除发生到最后一个<character_expression>中的最后一个字符。 convert
定义和用法
CONVERT() 函数是把日期转换为新数据类型的通用函数。
CONVERT() 函数可以用不同的格式显示日期/时间数据。
语法
CONVERT(data_type(length),data_to_be_converted,style)
data_type(length) 规定目标数据类型(带有可选的长度)。data_to_be_converted 含有需要转换的值。style 规定日期/时间的输出格式。
只使用convert,就是这样
SELECT DISTINCT userid,(
SELECT convert(varchar,area_id)+','
FROM userinfo_attarea t2
WHERE t2.employee_id=t1.employee_id
FOR XML PATH('') as area_ids 输出:
userid area_ids
1 4,5,6,
两个一起用,为了去掉后面的符号,
SELECT DISTINCT userid,STUFF((
SELECT ','+ convert(varchar,area_id)
FROM userinfo_attarea t2
WHERE t2.employee_id=t1.employee_id
FOR XML PATH('')
), , , '') 输出:
userid area_ids
1 4,5,6
SQLserver2008一对多,多行数据显示在一行的更多相关文章
- T-SQL 合并多行数据显示到一行
思路: 自连接,使用For XML Path('')和STUFF函数 SELECT * FROM STUDENT Name Team------------- ...
- 使用自连接、for xml path('')和stuff合并显示多行数据到一行中(转)
原文: http://njm.iteye.com/blog/795881 --使用 自连接.for xml path('')和stuff合并显示多行数据到一行中 --注 --1.计算列可以不用包含在聚 ...
- Oracle之多行记录变一行记录,行变列,并排序(wmsys.wm_concat)
原帖:http://www.cnblogs.com/nayitian/p/3231734.html wmsys.wm_concat Definition: The Oracle PL/SQL WM_C ...
- linux下在某行的前一行或后一行添加内容
linux的sed工具是十分强大的,能很容易的实现在某关键词的前一行或后一行增加内容.今天在批量修改tomcat的日志时就用到了该功能. 一.在某行的前一行或后一行添加内容 具休操作如下: #匹配行前 ...
- C#控制定位Word光标移动到任意行或者最后一行,取得光标位置等操作
C#控制定位Word光标移动到任意行或者最后一行,取得光标位置等操作 http://blog.csdn.net/jglie/article/details/7394256 十一.上下左右移动光标位 p ...
- Firebird 同一字段的多行合并为一行
Firebird 同一字段的多行合并为一行用LIST函数类似于MYSQL的GROUP_CONCAT. 具体用法如下: SELECT LIST(a.GG_NAME||':'||a.GG_VALUE) ...
- WPF编程:textbox控件文本框数据显示最后一行
WPF编程:textbox控件文本框数据显示最后一行 TextBox控件在接收大量数据的时候,滚动条一般在最上方,如何使滚动条随着数据的接收而向下滚动呢?比如有一个TextBox'控件txbRecvD ...
- ELK之使用filebeat的多行过滤插件把多行合并成一行
java运行日志一般有多行,格式类似如下 格式为:日期 + 日志级别 + 日志信息 有些日志是多行的,需要使用filebeat多行插件把多行合并成一行 未使用多行插件的日志格式 修改filebeat配 ...
- Oracle数据库多行记录转换一行并排序函数
Oracle数据库多行记录转换一行并排序方法 在ORACLE数据库查询中,我们通常会要求用到将多行记录转换成一行并排序,这时候我们自然会想到Oracle的一个“wx_concat”函数,可以将多行记录 ...
随机推荐
- Windows Server 2016-Powershell之客户端加域
将本地计算机添加到域或工作组,可通过Add-Computer命令操作,具体信息如下: 语法: Add-Computer [-DomainName] <String> [-ComputerN ...
- kodi18.1设置中文的方法
默认情况下,新安装好的 Kodi 启动后是英文版的界面.但事实上,Kodi 包含多国语言 (包含简繁体中文版),我们可以设置改回简体中文界面.不过,很多人都遇到修改 Kodi 的语言为中文之后整个界面 ...
- 深入理解 new 操作符
和其他高级语言一样 JavaScript 也有 new 操作符,我们知道 new 可以用来实例化一个类,从而在内存中分配一个实例对象. 但在 JavaScript 中,万物皆对象,为什么还要通过 ne ...
- 打开ubantu报错(invalid environment block. Press any key to continue)
今天向往常一样打开ubantu ,却无法正常打开,如下图 意思是无效的环境模块,随意按键继续,按任意键后如下图 折腾了许久问题也没有得到解决,后来在某篇博客中找到了答案 https://blog.cs ...
- 网站被k到可以使用关键词搜索到首页优化总结
从今年二月份,刚过完年回到公司,大约一周多过后,网站就被不知名黑客攻击,然后又因为网站标题关键词堆砌导致网站被降权,从此首页不在有我的网站的踪迹,有的只是其他页面的信息,因为刚开始接触SEO,对这一块 ...
- SpringBoot进阶教程(二十二)集成RabbitMQ---MQ实战演练
RabbitMQ是一个在AMQP基础上完成的,可复用的企业消息系统.他遵循Mozilla Public License开源协议.RabbitMQ是流行的开源消息队列系统,用erlang语言开发.Rab ...
- 基于SpringBoot实现定时任务的设置(常用:定时清理数据库)
1.构建SpringBoot工程项目 1)创建一个Springboot工程,在它的程序入口加上@EnableScheduling,开启调度任务. @SpringBootApplication @Ena ...
- Vue2.0源码阅读笔记(一):选项合并
Vue本质是上来说是一个函数,在其通过new关键字构造调用时,会完成一系列初始化过程.通过Vue框架进行开发,基本上是通过向Vue函数中传入不同的参数选项来完成的.参数选项往往需要加以合并,主要有 ...
- Flink的分布式缓存
分布式缓存 Flink提供了一个分布式缓存,类似于hadoop,可以使用户在并行函数中很方便的读取本地文件,并把它放在taskmanager节点中,防止task重复拉取.此缓存的工作机制如下:程序注册 ...
- JAVA线程池学习,ThreadPoolTaskExecutor和ThreadPoolExecutor有何区别?
初学者很容易看错,如果没有看到spring或者JUC源码的人肯定是不太了解的. ThreadPoolTaskExecutor是spring core包中的,而ThreadPoolExecutor是JD ...