分组字符合并SQL语句 按某字段合并字符串之一(简单合并)
标题:按某字段合并字符串之一(简单合并)
描述:将如下形式的数据按id字段合并value字段。
id value
-----------
1 aa
1 bb
2 aaa
2 bbb
2 ccc
需要得到结果:
id value
-----------------
1 aa,bb
2 aaa,bbb,ccc
即:groupbyid,求value的和(字符串相加)
1、sql2000中只能用自定义的函数解决
createtabletb(idint,valuevarchar(10)) insertintotbvalues(1,'aa') insertintotbvalues(1,'bb') insertintotbvalues(2,'aaa') insertintotbvalues(2,'bbb') insertintotbvalues(2,'ccc') go createfunctiondbo.f_str(@idint) returnsvarchar(100) as begin declare@strvarchar(1000) set@str=''select@str=@str+''+cast(valueasvarchar) fromtbwhereid=@id set@str=right(@str,len(@str)-1) return@str end go --调用函数 selectid,value=dbo.f_str(id)fromtbgroupbyid dropfunctiondbo.f_str droptabletb
2、sql2005中的方法
createtabletb(idint,valuevarchar(10)) insertintotbvalues(1,'aa') insertintotbvalues(1,'bb') insertintotbvalues(2,'aaa') insertintotbvalues(2,'bbb') insertintotbvalues(2,'ccc') go selectid,[value]=stuff((select','+[value]fromtbtwhereid=tb.id forxmlpath('')),1,1,'')fromtbgroupbyid droptabletb
3、使用游标合并数据
createtabletb(idint,valuevarchar(10)) insertintotbvalues(1,'aa') insertintotbvalues(1,'bb') insertintotbvalues(2,'aaa') insertintotbvalues(2,'bbb') insertintotbvalues(2,'ccc') go declare@ttable(idint,valuevarchar(100)) --定义结果集表变量 --定义游标并进行合并处理 declaremy_cursorcursorlocalfor selectid,valuefromtb declare@id_oldint,@idint,@valuevarchar(10),@svarchar(100) openmy_cursorfetchmy_cursorinto@id,@value select@id_old=@id,@s=''while@@FETCH_STATUS=0 begin if@id=@id_old select@s=@s+','+cast(@valueasvarchar)else begin insert@tvalues(@id_old,stuff(@s,1,1,'')) select@s=','+cast(@valueasvarchar),@id_old=@id end fetchmy_cursorinto@id,@valueEND insert@tvalues(@id_old,stuff(@s,1,1,'')) closemy_cursor deallocatemy_cursor select*from@t droptabletb
以上就是关于分组字符合并SQL语句的介绍。希望对大家有所帮助。