当前位置: 代码迷 >> Sql Server >> sql归并某列字段-100分
  详细解决方案

sql归并某列字段-100分

热度:6298   发布时间:2013-02-26 00:00:00.0
sql合并某列字段--100分
一个sql的查询结果是:

select * from t1

查询结果是:
id   AppD_Name    userName
 1     会签            xm
 1     会签            cp
 2      会签            aa

想用sql在此查询结果上查出:
id   AppD_Name    userName
 1     会签            xm,cp
 2      会签            aa



------解决方案--------------------------------------------------------
CREATE TABLE #t2(
id int,
AppD_Name varchar(10),
userName  varchar(10))
insert into #t2(id,AppD_Name) select distinct id,AppD_Name from t1
Declare @id int,@userName varchar(10),@uname varchar(10),@pd int,@c1 int,@c2 int,@s1 int,@s2 int
select @c1=count(id) from #t2

Declare rea CURSOR FOR
select id from #t2
open rea
set @s1=0
while @s1<@c1
begin
set @s1=@s1+1
fetch next from rea into @id

declare na CURSOR FOR
select userName from t1 where id=@id
open na
set @s2=0
set @pd=0
select @c2=count(id) from t1 where id=@id
while @s2<@c2
begin
set @s2=@s2+1
set @pd=@pd+1
fetch next from na into @uname
if (@pd=1)
set @userName=@uname
else
set @userName=@userName+','+@uname
end
set @s2=0
set @pd=0
update #t2 set userName=@userName where id=@id
CLOSE na
DEALLOCATE na

end
CLOSE rea
DEALLOCATE rea
GO
select * from #t2
drop table #t2
------解决方案--------------------------------------------------------
其实这个需求就是对字符串的累加
sql语法里有sum(数值)了,sql的设计者却想不到提供一个sum(字符串)的功能
希望新版能知错就改

那个分页(top n skip m)功能也是,始终只有半截(只有top n没有skip m),搞得分页要大动干戈(多次使用top n来倒腾,或利用sql2005才支持的row_number()函数)
sql2012才支持完整的分页
------解决方案--------------------------------------------------------
use xuanya
if object_id('csdn','u') is not null
drop table csdn --按你的要求创建一个表,表名和列名跟你说的有点不一样,内容相同
create table csdn(
id int,
app_name varchar(20),
user_name varchar(20))
insert into csdn values(1,'会签','xm')
insert into csdn values(1,'会签','cp')
insert into csdn values(2,'会签','aa')
go
select b.id,b.app_name,left(std,len(std)-1) from(
select id,app_name,(select user_name+','
from csdn where id=a.id and app_name=a.app_name
FOR XML PATH('')) as std
 
from csdn as a
group by id,app_name) as b

红色部分是通过FOR XML PATH 将id和app_name相同的部分的user_name显示成“xm,cp”的格式;
其余的部分不难,你应该能看懂了。
这个程序我试过了,是正确的
  相关解决方案