请教1个SQL的问题

zhang427397 2010-10-26 09:47:52
我现在查询的数据为
名称 编号 专业
张三 2 无线
张三 2 有线

我要把2条数据在SQL里面拼成一条。。
名称 编号 专业
张三 2 无线,有线


不知道该怎么写

请高手回答下,谢谢
...全文
53 点赞 收藏 10
写回复
10 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
alfred_2006 2010-10-26
自关联应该就可以
回复
zhang427397 2010-10-26
3个字段不在同一个表里面也可以套用这个函数吗
回复
dawugui 2010-10-26
--sql 2000
create table tb(名称 nvarchar(10),编号 int,专业 nvarchar(10))
insert into tb values(N'张三', 2 ,N'无线')
insert into tb values(N'张三', 2 ,N'有线')
go

create function dbo.f_str(@名称 varchar(10),@编号 int) returns varchar(1000)
as
begin
declare @str varchar(1000)
select @str = isnull(@str + ',' , '') + cast(专业 as varchar) from tb where 名称 = @名称 and 编号 = @编号
return @str
end
go

--调用函数
select 名称 , 编号 , 专业 = dbo.f_str(名称, 编号) from tb group by 名称, 编号

drop function dbo.f_str

drop table tb

/*
名称 编号 专业
---------- ----------- -----------
张三 2 无线,有线

(所影响的行数为 1 行)
*/


--sql 2005
create table tb(名称 nvarchar(10),编号 int,专业 nvarchar(10))
insert into tb values(N'张三', 2 ,N'无线')
insert into tb values(N'张三', 2 ,N'有线')
go

select 名称 , 编号, [专业] = stuff((select ',' + [专业] from tb t where 名称 = tb.名称 and 编号 = tb.编号 for xml path('')) , 1 , 1 , '')
from tb
group by 名称 , 编号

drop table tb

/*
名称 编号 专业
---------- ----------- ----------
张三 2 无线,有线

(1 行受影响)
*/


回复
zhang427397 2010-10-26
哦,知道了,谢谢
回复
dawugui 2010-10-26
[Quote=引用 4 楼 zhang427397 的回复:]
我的SQL是这样子写的 。。。select a.operatorid,a.operatorname ,a.userid from eosoperator a
我的数据是变化的,有可能还有李四
该怎么套用你的方法啊
我是新手正在学习中。
[/Quote]
sql 2000,sql 2005的方法都告诉你了,你只要对应放进字段名即可.
回复
HSBOY86 2010-10-26
create table #t1
(
[name] nvarchar(50),
[id] int,
value nvarchar(50)
)
insert into #t1
select 'a',2,'no' union all
select 'a',2 ,'yes'


Declare @m nvarchar(100);
set @m='';
select @m=@m+' '+value from #t1

select distinct name,id,@m as value from #t1
回复
zhang427397 2010-10-26
我的SQL是这样子写的 。。。select a.operatorid,a.operatorname ,a.userid from eosoperator a
我的数据是变化的,有可能还有李四
该怎么套用你的方法啊
我是新手正在学习中。
回复
dawugui 2010-10-26
--sql 2005
select 名称 , 编号, [专业] = stuff((select ',' + [专业] from tb t where 名称 = tb,名称 and 编号 = tb.编号 for xml path('')) , 1 , 1 , '')
from tb
group by 名称 , 编号
回复
dawugui 2010-10-26
--sql 2000用函数.
create function dbo.f_str(@名称 varchar(10),@编号 int) returns varchar(1000)
as
begin
declare @str varchar(1000)
select @str = isnull(@str + ',' , '') + cast(专业 as varchar) from tb where 名称 = @名称 and 编号 = @编号
return @str
end
go

--调用函数
select 名称 , 编号 , 专业 = dbo.f_str(名称, 编号) from tb group by 名称, 编号

drop function dbo.f_str
回复
dawugui 2010-10-26
/*
标题:按某字段合并字符串之一(简单合并)
作者:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开)
时间:2008-11-06
地点:广东深圳

描述:将如下形式的数据按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 varchar(10)) returns varchar(1000)
as
begin
declare @str varchar(1000)
select @str = isnull(@str + ',' , '') + cast(value as varchar) from tb where id = @id
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
回复
相关推荐
发帖
疑难问题
创建于2007-09-28

2.1w+

社区成员

MS-SQL Server 疑难问题
申请成为版主
帖子事件
创建了帖子
2010-10-26 09:47
社区公告
暂无公告