文档章节

Sql Server合并多行询数据到一行:使用自连接、FOR XML PATH('')、STUFF或REPLACE函数

深圳大道
 深圳大道
发布于 2016/12/29 15:32
字数 324
阅读 21
收藏 0

示例表 tb 数据如下

id value
—————
1 aa
1 bb
2 aaa
2 bbb
2 ccc

SELECT id,
       [val] = (
           SELECT [value] + ','
           FROM   tb AS b
           WHERE  b.id = a.id FOR XML PATH('')
       )
FROM   tb AS a
显示结果
1 aa,bb,
1 aa,bb,
2 aaa,bbb,ccc,
2 aaa,bbb,ccc,
2 aaa,bbb,ccc, 

SELECT id,    
       [val]=( SELECT [value] +','    
               FROM tb AS b    
               WHERE b.id = a.id    
               FOR XML PATH('')  )    
FROM tb AS a     
GROUP BY id
显示结果
1 aa,bb,
2 aaa,bbb,ccc, 

SELECT id,    
       [val]=STUFF( (SELECT ','+[value]    
                     FROM tb AS b    
                     WHERE b.id = a.id    
                     FOR XML PATH('')) , 1 , 1 , '' )   
FROM tb AS a     
GROUP BY id
显示结果
1 aa,bb
2 aaa,bbb,ccc

STUFF 函数将字符串插入另一字符串。它在第一个字符串中从开始位置删除指定长度的字符;然后将第二个字符串插入第一个字符串的开始位置。
STUFF ( character_expression , start , length ,character_expression_insert )

SELECT id,    
       [val]= REPLACE( (SELECT [value] AS [data()]   
                        FROM tb AS b    
                        WHERE b.id = a.id    
                        FOR XML PATH('')) , ' ', ',')   
FROM tb AS a     
GROUP BY id
结果与上面一样。

解析:[data()] 这里据说是起到一个类似数组的作用,具体用法还要再查。

如果外围不用REPLACE函数包住,则返回的结果是 aaa bbb ccc ,每项之间有空格,所以最后用REPLACE函数将所有空格替换成逗号。


本文转载自:http://blog.csdn.net/smartsmile2012/article/details/9178019

共有 人打赏支持
深圳大道
粉丝 3
博文 877
码字总数 0
作品 0
深圳
架构师
私信 提问
T-SQL中多行数据合并到一行(note)

示例表 tb 数据如下 id value ————— 1 aa 1 bb 2 aaa 2 bbb 2 ccc 第一种 SELECT id, [val]=( SELECT [value] +',' FROM tb AS b WHERE b.id = a.id FOR XML PATH('') ) FROM tb AS a ......

风之语着
2011/07/06
0
0
使用SQL2012报表生成器自定义IT资产报表

本文将介绍如何通过SQL Server 2012 SP1的报表生成器自定义报表,为了更贴近实战,本文将自定义一张IT资产报表。 一、部署IT资产管理系统 1、本文使用微软SCCM2012R2(System Center Configu...

技术小大人
2017/11/09
0
0
Oracle行转列

如果是oracle 10g以上 一个wm_concat函数就可以解决。 如果是oracle 9i以下就有点麻烦了。 表结构如下: NAME Null Type NSECCODE NOT NULL CHAR(6) CRESEARCHERCODE NOT NULL VARCHAR2(20)...

竹逸风
2016/06/22
9
0
GROUP BY 后合并指定字段的所有值

1.SELECT GROUP_CONCAT( NAME ) FROM TB GROUP BY ID; 2.SELECT ID, NAME= STUFF ((SELECT ',' + VALUE FROM TB AS T WHERE T .ID = TB.ID FOR XML PATH('')), 1, 1, '') FROM TB GROUP BY I......

dillonxiao
2018/09/01
0
0
Oracle 行转列pivot 、列转行unpivot 的Sql语句总结

转自:http://blog.csdn.net/xiaokui_wingfly/article/details/42419207 多行转字符串 这个比较简单,用||或concat函数可以实现 实际上就是拆分字符串的问题,可以使用 substr、instr、regex...

Amui
2016/06/29
373
0

没有更多内容

加载失败,请刷新页面

加载更多

【抢购/秒杀】redis实现高并发下的抢购/秒杀功能

问题: 抢购/秒杀是如今很常见的一个应用场景,那么高并发竞争下如何解决超抢(或超卖库存不足为负数的问题)呢? 常规写法: 查询出对应商品的库存,看是否大于0,然后执行生成订单等操作,但...

echojson
11分钟前
1
0
tomcat 集群与 redis 分布式

1.学习

狼王黄师傅
14分钟前
0
0
如何正确的每天坚持背5个单词?

自从开始学习英语,我们的老师就一直告诉我们,如果每天能坚持背五个单词,一年365天就能背1800个单词初中三年,你就能背会5400个单词,背会5400个单词,就算参加高考也搓搓有余。 好吧,话是...

我是菜鸟我骄傲
23分钟前
0
0
Docker之MySql5.7中only_full_group_by的问题解决

MySql的镜像,默认情况下,MySql5.7中的sql_mode含有only_full_group_by,group by语句有时候会报错。通过手动修改sql_mode,那么如果删除容器或者新建容器,就会导致我们手动设置的sql_mod...

克虏伯
40分钟前
0
0
介绍Python中6个序列的内置类型

1、Python中6个序列的内置类型分别是什么? Python包含6中内建的序列,即列表、元组、字符串、Unicode字符串、buffer对象和 xrange 对象。序列通用的操作包括:索引、长度、组合(序列相加)...

问题终结者
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部