利用FOR XML PATH行转列(根据某字段分组,多行数据转成一行,并用逗号隔开)

CREATE TABLE #TEST
(A VARCHAR(10) NULL,B VARCHAR(MAX) NULL)

INSERT INTO #TEST
SELECT ‘A‘,‘A001‘
UNION ALL
SELECT ‘A‘,‘A002‘
UNION ALL
SELECT ‘A‘,‘A003‘
UNION ALL
SELECT ‘B‘,‘B001‘
UNION ALL
SELECT ‘B‘,‘B002‘

SELECT * FROM #TEST

--先来看一个简单的,效果如下图所示:

SELECT STUFF((SELECT ‘,‘+B FROM #TEST FOR XML PATH(‘‘)),1,1,‘‘)

---------------------------------------------------------------

--再来个我们想要的,效果见下图:
SELECT DISTINCT t1.A,
REPLACE((SELECT B AS [data()] FROM #TEST t2 WHERE t1.A=t2.A FOR XML PATH(‘‘)),‘ ‘,‘,‘) AS B
FROM #TEST t1

---------------------------------------------------------------

原文地址:https://www.cnblogs.com/lrl45/p/12001108.html

时间: 2024-10-13 05:47:10

利用FOR XML PATH行转列(根据某字段分组,多行数据转成一行,并用逗号隔开)的相关文章

主表连接多行从表数据转成一行并用逗号连接

SELECT Id,UserName,[Password], STUFF(( SELECT ',' + [Description] FROM (SELECT uir.UserId,rol.[Description] FROM [Security].UserInRole uir INNER JOIN [Security].[Role] rol ON rol.Id=uir.RoleId) as userRoleView WHERE userRoleView.UserId = us.Id FOR XM

SQL 将一条记录中多个字段的值拼接为一个字段 && 将多行数据合并成一行,并且拼接CONVERT() 、for xml path的使用

接着上篇文章的订单表(商品编号,价格设置时间id(类似于创建时间,创建时间约早,则act_id越小) ,价格的时间段,商品价格) 一.将一条记录中多个字段的值拼接为一个字段 现要求将两个时间段合并为一个字段,应该如何做呢? 先来看下理想的结果: 查询出的时间段合并到一起了: 代码如下,将查询的字段用+'你想要的符号' + 拼接即可 select item,act_id,loc_id,convert(varchar(100),start_date,20)+ '-' +convert(varchar

Oracle一列的多行数据拼成一行显示字符

Oracle一列的多行数据拼成一行显示字符 oracle 提供了两个函数WMSYS.WM_CONCAT 和 ListAgg函数. www.2cto.com 先介绍:WMSYS.WM_CONCAT 例: id  name 1   aa 2   bb 3   cc 要的结果是"aa,bb,cc" select WMSYS.WM_CONCAT(a.name) from user a 这样的话,查询出的结果:"aa,bb,cc" www.2cto.com 分隔符如果不需要用

mysql中将多行数据合并成一行数据

一个字段可能对应多条数据,用mysql实现将多行数据合并成一行数据 例如:一个活动id(activeId)对应多个模块名(modelName),按照一般的sql语句: 1 SELECT am.activeId,m.modelName 2 FROM activemodel am 3 JOIN model m 4 ON am.modelId = m.modelId 5 ORDER BY am.activeId 查询出的列表为图1所示: 图1 修改过后的sql语句,查询后如图2所示: 1 SELECT

delphi CXGRID用法 (取行、列值;定位选中某行等等)

CXGRID用法 (取行.列值:定位选中某行等等) Delphi Cxgrid获取选中行列,排序规则,当前正在编辑的单元格内的值 cxGrid1DBTableView1.Controller.FocusedRowIndex 当前行号 cxGrid1DBTableView1.Controller.FocusedRow 当前行 cxGrid1DBTableView1.Controller.FocusedColumn 当前列 cxGrid1DBTableView1.Controller.Focused

sql查询 ,多行数据合并成一行,并且显示合并后某一列的值拼接结果

select  [value] = stuff((select ','+modmb003  from modmb detail where modmb=18 for xml path('')), 1, 1, '') 其中stuff的作用是:删除指定长度的字符,并在指定的起点处插入另一组字符 语法:STUFF ( character_expression , start , length ,character_expression ) 列:SELECT STUFF('abcdef', 2, 3,

oracle的神奇化学反应(行转列+获取表字段)

橘子+汽水=橘子汽水,∑(?Д?ノ)ノ好无聊!!! 火鸡+烤架=烤火鸡,?(´?`?)还不错. wm_concat()+表字段查询=(?ω?)会是啥呢? wm_concat()函数,该函数可以把列值以","号分隔,并显示成一行.例子如下: 我有一个超级大的美食表CHINA_FOODS,里面包含了全国各地的美食,从地锅鸡.羊盘肠到红烧肉.臭豆腐... 今天加班写博客,写到这里的时候我感觉肥肠的饿,想点个外卖,于是想从美食表里面找个好吃的下单: 为了节省时间来写博客,我决定把下单和付款的重

oracle查询多行数据合并成一行数据

如果是oracle 10g以上 一个wm_concat函数就可以解决. 如果是oracle 9i以下就有点麻烦了. 表结构如下: NAME Null Type ------------------------ --------- ----- N_SEC_CODE NOT NULL CHAR(6) C_RESEARCHER_CODE NOT NULL VARCHAR2(20) 此表保存了“股票”与“研究员”的对应关系数据,一般而言,对于同一只股票而言,可能有多个研究员 对其进行跟踪研究.所以目前遇

SQL SERVER将多行数据合并成一行(转)

1)比如表中有三列数据: 2)执行如下查询: 1 SELECT [USER_NAME], [USER_ACCOUNT] 2 , [ROLE_NAME] = stuff(( 3 SELECT ',' + [ROLE_NAME] 4 FROM [WAP_WORKSHEET].[dbo].[userTest] 5 WHERE [USER_ACCOUNT] = a.[USER_ACCOUNT] 6 FOR XML path('') 7 ), 1, 1, '') 8 FROM [WAP_WORKSHEET