我的编程空间,编程开发者的网络收藏夹
学习永远不晚

SQL Server实现group_concat功能的详细实例

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

SQL Server实现group_concat功能的详细实例

一、实现

#tmp表内容如下:

实现group_concat的sql语句为:

Select
  RegionID,
  STUFF(
       (
         SELECT ',' + T.c1
         FROM #tmp T
         WHERE A.regionid = T.regionid
         FOR XML PATH('')
       ), 1, 1, ''
     ) as group_concat 
FROM #tmp A
Group by  RegionID

实现效果如下:

二、原理分析

2.1、FOR XML PATH的作用

FOR XML PATH 的作用是将查询结果集以XML形式展现,将多行的结果,展示在同一行,例如:

select c1 from #tmp where RegionID = 41653

其结果集如下:

select c1 from #tmp where RegionID = 41653 FOR XML PATH('')

当sql语句加上 FOR XML PATH('') 后,其结果集输出是:

具体输出的字符如下:

<c1>30.326809</c1><c1>30.327982</c1><c1>30.347933</c1><c1>30.388104</c1><c1>30.392830</c1><c1>30.367931</c1><c1>30.368052</c1><c1>30.367842</c1><c1>30.357318</c1><c1>30.357349</c1><c1>30.357349</c1>

通过字符拼接后可以把xml信息清除,并以指定的字符进行分割:

select ',' + c1 from #tmp where RegionID = 41653 FOR XML PATH('')

此时已基本达到group_concat的效果,但第一个字符串有分隔符需要去掉。

2.2、STUFF函数

2.2.1、STUFF函数在本SQL的作用

我们使用STUFF函数的目的是把第一个分隔符去掉。先看看效果:

上图可以看到,STUFF函数把字符串“abcdefg”中的第一个字符“a”删除。

使用该函数我们可以很轻松的把上图得到的结果集去掉第一个逗号分隔符:

需要详细了解STUFF函数可继续看该函数的语法,没兴趣的可以忽略。

2.2.2、STUFF函数语法

STUFF函数的作用是将字符串插入到另一个字符串中。它从第一个字符串的开始位置删除指定长度的字符,然后将第二个字符串插入到第一个字符串的开始位置。其语法为:

STUFF(character_expression , start , length , replaceWith_expression)

character_expression:字符数据的表达式,可以是常量、变量,也可以是字符列或二进制数据列。

start:一个整数值(从1开始),指定删除和插入的开始位置。start的类型可以是bigint。

  • 如果 start 为负或为零,则返回空字符串。

  • 如果 start 的长度大于第一个 character_expression,则返回空字符串。 

length:一个整数,指定要删除的字符数。length的类型可以是 bigint。

  • 如果 length 为负,则返回空字符串。

  • 如果 length 的长度大于character_expression,则最多可以删除到character_expression 中的最后一个字符。

  • 如果 length 为零,则不删除字符直接在指定位置插入内容。 

replaceWith_expression:字符数据的表达式,可以是常量、变量,也可以是字符列或二进制数据列。此表达式从 start 开始替换 length 个字符的character_expression。

  • 如果 replaceWith_expression 为 NULL,则在不插入任何内容的情况下删除字符。

2.3、sql语分分析

2.3.1、一个简单的group by

Select RegionID 
FROM #tmp A
Group by RegionID

这个sql各位看官都十分熟悉,已经没什么好说的了。

2.3.2、在select语句后面加上子查询

Select RegionID,
    (
      SELECT ',' + T.c1
      FROM #tmp T
      WHERE A.regionid = T.regionid
      FOR XML PATH('')
    ) 
FROM #tmp A
Group by RegionID

在上述简单的group by语句基础上加入一个select里的子查询,其结果如下:

在该子查询中,当外层的group by返回结果集中的第一行RegionID为41653时,这个值被子查询的where条件所使用,相当于:

SELECT ',' + T.c1
FROM #tmp T
WHERE T.regionid = 41653
FOR XML PATH('')

因为FOR XML PATH把多行记录打平成一条记录,因此此时的返回结果为:

接着第group by返回结果集中的第二行45761传入该子查询,依次类似上面描述的执行,直到所有外层的值遍历完成。

2.3.3、去掉子查询结果集的第一个分隔符

Select
  RegionID,
  STUFF(
       (
         SELECT ',' + T.c1
         FROM #tmp T
         WHERE A.regionid = T.regionid
         FOR XML PATH('')
       ), 1, 1, ''
     ) as group_concat 
FROM #tmp A
Group by  RegionID

利用STUFF函数,去掉了第一个逗号,完成了最终sql语句。

总结

到此这篇关于SQL Server实现group_concat功能的文章就介绍到这了,更多相关SQLServer实现group_concat内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

SQL Server实现group_concat功能的详细实例

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

uniapp实现人脸识别功能详细示例

这次使用uni-app框架开发一个小程序,有一个刷脸功能,所以下面这篇文章主要给大家介绍了关于uniapp实现人脸识别功能的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
2022-11-13

SQL实现Excel的10个常用功能的示例详解

目录01. 关联公式:Vlookup02. 对比两列差异03. 去除重复值04. 缺失值处理05. 多条件筛选06. 模糊筛选数据07. 分类汇总08. 条件计算09. 删除数据间的空格10. 合并与排序列SQL笔试题原题某数据服务公司某手
2022-07-25

Android使用GridView实现日历功能示例(详细代码)

Android使用GridView实现日历功能示例,代码有点多,发个图先:如果懒得往下看的,可以直接下载源码吧,最近一直有人要,由于时间太久了,懒得找出来整理,今天又看到有人要,正好没事就整理了一下 源码下载。。。。布局文件:
2022-06-06

Qt实现模糊匹配功能的实例详解

对于浏览器的使用,我想大家一定不会陌生吧,输入要搜索的内容时,会出现相应的匹配信息。本文就来用Qt实现模糊匹配功能,感兴趣的可以了解一下
2022-11-13

SQL Server 实例之间传输登录名和密码的详细步骤

目录简介步骤如下1. 首先在源服务器A “master”数据库中创建两个存储过程。 过程分别名为“sp_hexadecimal”和“sp_help_revlogin”2
2023-06-09

Android实现发送短信功能实例详解

本文实例分析了Android实现发送短信功能的方法。分享给大家供大家参考,具体如下: 短信和打电话一样,都是android手机的基本功能,下面以实例说明android如何实现发送短信的功能。 程序如下所示:import java.util.
2022-06-06

Android 实现截屏功能的实例

Android 实现截屏功能的实例实现代码:public class ScreenShot { // 获取指定Activity的截屏,保存到png文件 private static Bitmap takeScreenShot(Activ
2023-05-30

怎么在SQL Server中实现一个模糊查询功能

怎么在SQL Server中实现一个模糊查询功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1.用_通配符查询"_"号表示任意单个字符,该字符号只能匹配一个字
2023-06-14

实现shallowReadonly和isProxy功能示例详解

这篇文章主要为大家介绍了实现shallowReadonly和isProxy功能示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2022-12-25

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录