sql将数据按照某一列合并

oralce写法:

select WM_CONCAT(A.title) as citys from tmpcity A

sql server写法:

select stuff((select ‘,’+A.title from tmpCity A FOR xml PATH(’’)), 1, 1, ‘’) as citys

mysql写法:

select GROUP_CONCAT(A.title) as citys from tmpcity A; --默认的逗号分隔
select GROUP_CONCAT(A.title SEPARATOR ’ ') as citys from tmpcity A; --用空格分隔

sql合并两列数据:
CONCAT(str1,str2,…)
select CONCAT(str1,"–",str2,…) from table

SQL Server中,有多种方法可以合并一列数据,以下为几种常见的方式: ### 使用STUFF和FOR XML PATH 可以使用`STUFF`和`FOR XML PATH`进行多行合并成一行。例如,假设有一个表名为`sys_role_permission` ,其中包含`role_id`和`role_permission_id`,可以使用如下类似的方式合并数据 [^3]。 示例代码如下,假设有一个`Assign`表、`StaffAssign`表和`Staff`表,要合并`Staff`表中的`userName`: ```sql SELECT t.id, t.names, t.isEditAll, t.isFenzhen, t.isDel, t.addTime, STUFF( ( SELECT ',' + t02.userName FROM Assign T0 LEFT JOIN StaffAssign t01 ON t01.assignID = t.id LEFT JOIN Staff t02 ON t02.id = t01.staffID WHERE t0.id = T.id FOR XML PATH('') ), 1, 1, '' ) as group_concat FROM Assign T LEFT JOIN StaffAssign t1 ON t1.assignID = t.id LEFT JOIN Staff t2 ON t2.id = t1.staffID GROUP BY t.id, t.names, t.isEditAll, t.isFenzhen, t.isDel, t.addTime; ``` 上述代码通过`FOR XML PATH('')`将子查询的结果以XML形式返回,再用`STUFF`函数去掉第一个多余的分隔符(这里是逗号) [^4]。 ### 递归查询树型结构并合并数据 对于递归查询树型结构某节点的所有上级节点,并且把这些所有上级节点多行拼接为一行(合并数据),可以使用递归CTE(Common Table Expressions)结合`STUFF`和`FOR XML PATH`。示例如下 [^5]: ```sql WITH eps_root(pk_eps, pk_parent, eps_code, eps_name) AS ( SELECT pk_eps, pk_parent, eps_code, eps_name FROM pm_eps WHERE enablestate = 2 AND pk_eps = '1001A11000000003P62E' UNION ALL SELECT e.pk_eps, e.pk_parent, e.eps_code, e.eps_name FROM pm_eps e INNER JOIN eps_root r ON e.pk_eps = r.pk_parent WHERE e.enablestate = 2 ) SELECT DISTINCT eps_code = stuff( ( SELECT '/' + convert(nvarchar(500), eps_code) FROM ( SELECT DISTINCT eps_code FROM eps_root ) r1 FOR XML PATH('') ), 1, 1, '' ), eps_name = stuff( ( SELECT '/' + eps_name FROM ( SELECT TOP 99.99 PERCENT eps_name FROM eps_root ORDER BY eps_code ) r2 FOR XML PATH('') ), 1, 1, '' ) FROM eps_root; ``` 此代码先通过递归CTE查询出所有上级节点,然后使用`STUFF`和`FOR XML PATH`将`eps_code`和`eps_name`数据分别合并成一行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值