求sql做法,不同记录同一字段合并字符串

csdnTimePeriod 2013-05-07 02:36:33
比如有表T
f1 f2
-------------
1 aaa
2 bbb
2 ccc
希望获得
f1 f2
-------------
1 aaa
2 bbbccc

怎样写好?
...全文
152 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
q465897859 2013-05-07
  • 打赏
  • 举报
回复
先去重 在用for xml path 拼接
唐诗三百首 2013-05-07
  • 打赏
  • 举报
回复
加个distinct即可,

create table 表T
(f1 int, f2 varchar(10))

insert into 表T
select 1, 'aaa' union all
select 2, 'bbb' union all
select 2, 'ccc' union all
select 2, 'ccc'


select f1,f2 from 表T
/*
f1          f2
----------- ----------
1           aaa
2           bbb
2           ccc
2           ccc

(4 row(s) affected)
*/


select a.f1,
       replace((select distinct '|'+f2  
        from 表T b
        where b.f1=a.f1
        for xml path('')),'|','') 'f2'
 from 表T a
 group by a.f1
 
/*
f1          f2
----------- -------------
1           aaa
2           bbbccc

(2 row(s) affected)
*/
MrYangkang 2013-05-07
  • 打赏
  • 举报
回复

with S as
(
	select f1,f2 from 表T group by f1,f2 
)
select t.f1,stuff((select ''+t2.f2 from S t2 where t2.f1 = t.f1 for xml path('')),1,O,'')'f2'
from S t 
group by t.f1
csdnTimePeriod 2013-05-07
  • 打赏
  • 举报
回复
大致知道使用for xml path(''),另外需要合并后的值没有重复的。比如 1 aaa 2 bbb 2 ccc 2 ccc 最后结果仍然是 1 aaa 2 bbbccc 就是说值在合并的时候需要去重再拼接起来。请问满足这步需要怎么做?
MrYangkang 2013-05-07
  • 打赏
  • 举报
回复
也可以这样

select f1,stuff((select ''+f2 from  表T where f1 = t.f1 for xml path('') ),1,0,'') 
from 表T t group by f1
唐诗三百首 2013-05-07
  • 打赏
  • 举报
回复

create table 表T
(f1 int, f2 varchar(10))

insert into 表T
select 1, 'aaa' union all
select 2, 'bbb' union all
select 2, 'ccc'


select a.f1,
       replace((select '|'+f2  
        from 表T b
        where b.f1=a.f1
        for xml path('')),'|','') 'f2'
 from 表T a
 group by a.f1
 
/*
f1          f2
----------- -------------
1           aaa
2           bbbccc

(2 row(s) affected)
*/

34,593

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧