按某字段合并字符串之一(简单合并) ----SQL

/*
标题:按某字段合并字符串之一(简单合并)
描述:将如下形式的数据按id字段合并value字段。


id    value
----- ------
1     aa
1     bb
2     aaa
2     bbb
2     ccc
需要得到结果:
id     value
------ -----------
1      aa,bb
2      aaa,bbb,ccc
即:group by id, 求 value 的和(字符串相加)

*/
-- 1、sql2000中只能用自定义的函数解决
create table tb(id int , value varchar ( 10 ))
insert into tb values ( 1 , ' aa ' )
insert into tb values ( 1 , ' bb ' )
insert into tb values ( 2 , ' aaa ' )
insert into tb values ( 2 , ' bbb ' )
insert into tb values ( 2 , ' ccc ' )
go

create function dbo.f_str( @id int ) returns varchar ( 100 )
as
begin
   
declare @str varchar ( 1000 )
   
set @str = ''
   
select @str = @str + ' , ' + cast (value as varchar ) from tb where id = @id
   
set @str = right ( @str , len ( @str ) - 1 )
   
return @str
end
go

-- 调用函数
select id , value = dbo.f_str(id) from tb group by id

drop function dbo.f_str
drop table tb


-- 2、sql2005中的方法
create table tb(id int , value varchar ( 10 ))
insert into tb values ( 1 , ' aa ' )
insert into tb values ( 1 , ' bb ' )
insert into tb values ( 2 , ' aaa ' )
insert into tb values ( 2 , ' bbb ' )
insert into tb values ( 2 , ' ccc ' )
go

select id, [ value ] = stuff (( select ' , ' + [ value ] from tb t where id = tb.id for xml path( '' )) , 1 , 1 , '' )
from tb
group by id

drop table tb


-- 3、使用游标合并数据
create table tb(id int , value varchar ( 10 ))
insert into tb values ( 1 , ' aa ' )
insert into tb values ( 1 , ' bb ' )
insert into tb values ( 2 , ' aaa ' )
insert into tb values ( 2 , ' bbb ' )
insert into tb values ( 2 , ' ccc ' )
go
declare @t table (id int ,value varchar ( 100 )) -- 定义结果集表变量
--
定义游标并进行合并处理
declare my_cursor cursor local for
select id , value from tb
declare @id_old int , @id int , @value varchar ( 10 ) , @s varchar ( 100 )
open my_cursor
fetch my_cursor into @id , @value
select @id_old = @id , @s = ''
while @@FETCH_STATUS = 0
begin
   
if @id = @id_old
      
select @s = @s + ' , ' + cast ( @value as varchar )
   
else
     
begin
       
insert @t values ( @id_old , stuff ( @s , 1 , 1 , '' ))
       
select @s = ' , ' + cast ( @value as varchar ) , @id_old = @id
     
end
   
fetch my_cursor into @id , @value
END
insert @t values ( @id_old , stuff ( @s , 1 , 1 , '' ))
close my_cursor
deallocate my_cursor

select * from @t
drop table tb

 

--4、简单小例子

----假设我们有如下数据表
--
----菜系表------------
--
店名        菜系------
--
澳门豆捞    川菜
--
澳门豆捞    粤菜
--
澳门豆捞    闽菜
--
为民大酒店  鲁菜
--
为民大酒店  粤菜
--
为民大酒店  川菜
--
---------------------

-------执行如下语句
select 店名,菜系=STUFF((select ','+ltrim(菜系) from 菜系表 where 店名=t.店名 for XML path('')),1,1,'')
from 菜系表 t
group by 店名

-------结果如下-------------
--
店名        菜系----------
--
澳门豆捞    川菜,闽菜,粤菜
--
为民大酒店  川菜,鲁菜,粤菜
--
--------------------------

转自多个地方就不一一列举了

谁转走、请附上

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值