现在有一个需求

我们有一张表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一对多,多行数据显示在一行的更多相关文章

  1. T-SQL 合并多行数据显示到一行

    思路: 自连接,使用For XML Path('')和STUFF函数 SELECT * FROM STUDENT Name                      Team------------- ...

  2. 使用自连接、for xml path('')和stuff合并显示多行数据到一行中(转)

    原文: http://njm.iteye.com/blog/795881 --使用 自连接.for xml path('')和stuff合并显示多行数据到一行中 --注 --1.计算列可以不用包含在聚 ...

  3. Oracle之多行记录变一行记录,行变列,并排序(wmsys.wm_concat)

    原帖:http://www.cnblogs.com/nayitian/p/3231734.html wmsys.wm_concat Definition: The Oracle PL/SQL WM_C ...

  4. linux下在某行的前一行或后一行添加内容

    linux的sed工具是十分强大的,能很容易的实现在某关键词的前一行或后一行增加内容.今天在批量修改tomcat的日志时就用到了该功能. 一.在某行的前一行或后一行添加内容 具休操作如下: #匹配行前 ...

  5. C#控制定位Word光标移动到任意行或者最后一行,取得光标位置等操作

    C#控制定位Word光标移动到任意行或者最后一行,取得光标位置等操作 http://blog.csdn.net/jglie/article/details/7394256 十一.上下左右移动光标位 p ...

  6. Firebird 同一字段的多行合并为一行

    Firebird 同一字段的多行合并为一行用LIST函数类似于MYSQL的GROUP_CONCAT. 具体用法如下: SELECT  LIST(a.GG_NAME||':'||a.GG_VALUE) ...

  7. WPF编程:textbox控件文本框数据显示最后一行

    WPF编程:textbox控件文本框数据显示最后一行 TextBox控件在接收大量数据的时候,滚动条一般在最上方,如何使滚动条随着数据的接收而向下滚动呢?比如有一个TextBox'控件txbRecvD ...

  8. ELK之使用filebeat的多行过滤插件把多行合并成一行

    java运行日志一般有多行,格式类似如下 格式为:日期 + 日志级别 + 日志信息 有些日志是多行的,需要使用filebeat多行插件把多行合并成一行 未使用多行插件的日志格式 修改filebeat配 ...

  9. Oracle数据库多行记录转换一行并排序函数

    Oracle数据库多行记录转换一行并排序方法 在ORACLE数据库查询中,我们通常会要求用到将多行记录转换成一行并排序,这时候我们自然会想到Oracle的一个“wx_concat”函数,可以将多行记录 ...

随机推荐

  1. Win10系统盘制作及安装流程

    一.下载最新版的 Win10 镜像 1.打开 MSDN 下载 Windows 系统镜像,即 https://msdn.itellyou.cn/ ​ 2.下载的 iso 镜像文件 ​ 3.你可以通过双击 ...

  2. Cocos Creator—如何给资源打MD5版本号

    Cocos Creator 是Cocos最新一代的游戏开发者工具,基于 Cocos2d-x,组件化,脚本化,数据驱动,跨平台发布.Cocos Creator的开发思路已经逐步跟Unity 3D靠拢,写 ...

  3. PHP获取远程http或ftp文件的md5值

    PHP获取本地文件的md5值: md5_file("/path/to/file.png"); PHP获取远程http文件的md5值: md5_file("https:// ...

  4. Go基础(3)

    demo1: package main import "fmt" func print() { for i := 1; i < 10; i++ { for j := 1; j ...

  5. redis的list类型!!!!

    list类型 list类型是按照插入顺序排序的字符串链表,可在(left)头部和(right)尾部插入值,效率高. list增操作 若插入时,该键不存在,则会创建.若所有元素被移除,该键也会被删除. ...

  6. Java Spring MVC框架搭建(一)

    环境准备 >>>>>>java JDK和tomcat,eclipse 1.创建项目 2.项目名称自定义,这边为demo 3.我们已经创建完一个动态网站的项目,还得下 ...

  7. qml demo分析(maroon-小游戏)

    1.效果展示 这篇文章我还是分析一个qt源码中的qml程序,程序运行效果如下图所示. 图1  游戏开始 图2  游戏中 2.源码分析 这个游戏的源码文件比较多,为了能更清楚的了解整个代码,我先整体分析 ...

  8. Node.js学习(第一章:Node.js简介)

    Node.js是什么? Node.js 诞生于 2009 年,由 Joyent 的员工 Ryan Dahl 开发而成, 目前官网最新版本已经更新到 12.0.0版本,最新稳定的是10.15.3.Nod ...

  9. Python:bs4的使用

    概述 bs4 全名 BeautifulSoup,是编写 python 爬虫常用库之一,主要用来解析 html 标签. 一.初始化 from bs4 import BeautifulSoup soup ...

  10. 一套代码小程序&Web&Native运行的探索04——数据更新

    接上文:一套代码小程序&Web&Native运行的探索03 对应Git代码地址请见:https://github.com/yexiaochai/wxdemo/tree/master/m ...