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].[dbo].[userTest] a
9 GROUP BY [USER_NAME], [USER_ACCOUNT]

3)显示如下结果:

STUFF函数:

a.作用

stuff(param1, startIndex, length, param2)
将param1中自startIndex(SQL中都是从1开始,而非0)起,删除length个字符,然后用param2替换删掉的字符。

b.参数

param1
一个字符数据表达式。param1可以是常量、变量,也可以是字符列或二进制数据列。
startIndex
一个整数值,指定删除和插入的开始位置。如果 startIndex或 length 为负,则返回空字符串。如果startIndex比param1长,则返回空字符串。startIndex可以是 bigint 类型。
length
一个整数,指定要删除的字符数。如果 length 比param1长,则最多删除到param1 中的最后一个字符。length 可以是 bigint 类型。

c.返回类型

如果param1是受支持的字符数据类型,则返回字符数据。如果param1是一个受支持的 binary 数据类型,则返回二进制数据。

d.备注

如果结果值大于返回类型支持的最大值,则产生错误。

FOR XML PATH  将查询结果集以XML形式展现,查询示例:

SELECT ‘[‘ + [USER_NAME] + ‘,‘ + [ROLE_NAME] + ‘]‘
FROM [WAP_WORKSHEET].[dbo].[userTest]
WHERE [USER_NAME] = ‘蔡诗德‘
FOR XML path(‘‘);

结果如图:

4)实际应用:

SELECT USER_ACCOUNT AS ‘用户账户‘, USER_NAME AS ‘用户名‘, ORGANIZATION_NAME AS ‘组织‘
, ‘角色‘ = REPLACE(REPLACE(REPLACE(STUFF((
SELECT ‘,‘ + ROLE_NAME
FROM [dbo].[wapUserAndRole_20190612_b]
WHERE USER_ACCOUNT = a.USER_ACCOUNT
FOR XML path(‘‘)
), 1, 1, ‘‘), ‘个人中心管理员,‘, ‘‘), ‘,个人中心管理员‘, ‘‘), ‘个人中心管理员‘, ‘‘)
FROM [dbo].[wapUserAndRole_20190612_b] a
GROUP BY USER_ACCOUNT, USER_NAME, ORGANIZATION_NAME
ORDER BY ORGANIZATION_NAME;

外业人员信息查询

 1 SELECT USER_ACCOUNT AS ‘用户账户‘, USER_NAME AS ‘用户名‘, ORGANIZATION_NAME AS ‘组织‘
 2     , ‘角色‘ = REPLACE(REPLACE(REPLACE(STUFF((
 3         SELECT ‘,‘ + ROLE_NAME
 4         FROM [dbo].[wapUserAndRole_20190612_b]
 5         WHERE USER_ACCOUNT = a.USER_ACCOUNT
 6         FOR XML path(‘‘)
 7     ), 1, 1, ‘‘), ‘个人中心管理员,‘, ‘‘), ‘,个人中心管理员‘, ‘‘), ‘个人中心管理员‘, ‘‘)
 8 FROM [dbo].[wapUserAndRole_20190612_b] a
 9 GROUP BY USER_ACCOUNT, USER_NAME, ORGANIZATION_NAME
10 ORDER BY ORGANIZATION_NAME;

原文引自:https://www.cnblogs.com/hendrix/p/11012772.html

原文地址:https://www.cnblogs.com/salmonLeeson/p/11557960.html

时间: 2024-08-26 21:17:35

SQL SERVER将多行数据合并成一行(转)的相关文章

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,

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

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

sql里将重复行数据合并为一行,数据用逗号分隔

DECLARE @T1 table ( UserID int , UserName nvarchar(50), CityName nvarchar(50) ); insert into @T1 (UserID,UserName,CityName) values (1,'a','上海') insert into @T1 (UserID,UserName,CityName) values (2,'b','北京') insert into @T1 (UserID,UserName,CityName)

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

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中将多行数据拼接为一行数据(一个字符串

方法一: 使用T-SQLDECLARE @Users NVARCHAR(MAX)SET @Users = ” SELECT @Users = @Users + ‘,’ + UserName FROM dbo.[User]WHERE RoleID = 1 SELECT @Users 方法二:使用for xml path(”) 和stuff–使用 自连接.for xml path(”)和stuff合并显示多行数据到一行中 –注–1.计算列可以不用包含在聚合函数中而直接显示,如下面语句的val.–2.

SQLServer 中多行数据合并成一行数据(一个字段)

需求:有四行数据,如下: 1.苹果 2.橘子 3.桃子 4.波罗 合并成一个字段:苹果,橘子,桃子,波罗: 需求明确之后,先弄点测试数据,上代码: --创建一个临时表 Create table #temp ( testName varchar(20) ) --写入测试数据 INSERT INTO #temp(testName) values('苹果'); INSERT INTO #temp(testName) values('橘子'); INSERT INTO #temp(testName) v

T_SQL 将一列多行数据合并为一行

T_SQL 将一列多行数据合并为一行 SQL Server在进行数据迁移和报表处理的时候会遇到将一列多行数据拼接为一个字符串的情况,为了处理这个问题,在网上找了一些相关的资料,提供两种方法,供遇到类似问题的朋友们参考,也借此加深自己的印象. Table:SC Student Course 张三 大学语文 李四 大学语文 张三 书法鉴赏 张三 音乐欣赏 李四 电影赏析 期望得到的结果: Student Course 张三 大学语文,书法鉴赏,音乐欣赏 李四 大学语文,电影赏析 IF OBJECT_

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 分隔符如果不需要用