请教一句SQL文的写法

bluelazysb 2006-02-10 09:06:17
表中有4个字段,A,B,C.
现在想以A字段分组,并在结果集中增加一个字段D,值为同组的其他纪录的B,C字段当中加‘-’,如果有多个则用逗号隔开.
例:

A B C D
1 E1 6KC F2-CKA, H3-MM
1 F2 CKA E1-6KC, H3-MM
1 H3 MM E1-6KC, F2-CKA
2 44 T2 GH-578
2 GH 578 44-T2
请问这样的SQL文怎么写
...全文
147 点赞 收藏 11
写回复
11 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
$扫地僧$ 2006-02-10
create table T
(A int,B varchar(20),C varchar(20))

insert t
select 1,'E1','6KC' union all
select 1,'F2','CKA' union all
select 1,'H3','MM' union all
select 2,'44','T2' union all
select 2,'GH','578'




create Function T_Fun(@A int,@B varchar(800))
returns varchar(8000)
as
begin
declare @T_SQL varchar(8000)
set @T_SQL=''
select @T_SQL=@T_SQL + B +'-'+C +',' from T where B+C<>@B and A=@A
set @T_SQL=left(@T_SQL,len(@T_SQL)-1)
return @T_SQL
end

select A,B,C,dbo.T_Fun(A,B+C) from T
回复
$扫地僧$ 2006-02-10
一句 不太可能哦!
要不你用函数吗!
回复
bluelazysb 2006-02-10
可是由于使用的框架影响,不能使用存储过程。
想用一句sql文实现,怎么办?
回复
dutguoyi 2006-02-10
mark
回复
这个写得有一点失误,他的函数的条件写得不对

回复人: samfeng_2003(凤翼天翔) ( ) 信誉:100

create function f_he(@a int,@b varchar(20),@c varchar(20))
returns varchar(50)
as
begin
declare @sql varchar(50)
set @sql=''
select @sql=@sql+','+b+'-'+c from t where A=@a and B<>@b and C<>@c
return(stuff(@sql,1,1,''))
end

应该改为:

create function f_he(@a int,@b varchar(20),@c varchar(20))
returns varchar(50)
as
begin
declare @sql varchar(50)
set @sql=''
select @sql=@sql+','+b+'-'+c from t where A=@a and (B<>@b or C<>@c)
return(stuff(@sql,1,1,''))
end

原因很简单:
A=@a and B<>@b and C<>@c
这个条件如果有B相同但C不同他也给去掉了。
如多插入一条1,"E1","AAA"
两个结果就会很明显。
回复
bugouku 2006-02-10
select a, b +'-' +c as d from Table1 group by a,b,c

看你的意思应该是这么写吧?`
回复
samfeng_2003 2006-02-10
create table t
(A int,B varchar(20),C varchar(20))

insert t
select 1,'E1','6KC' union all
select 1,'F2','CKA' union all
select 1,'H3','MM' union all
select 2,'44','T2' union all
select 2,'GH','578'
go
create function f_he(@a int,@b varchar(20),@c varchar(20))
returns varchar(50)
as
begin
declare @sql varchar(50)
set @sql=''
select @sql=@sql+','+b+'-'+c from t where A=@a and B<>@b and C<>@c
return(stuff(@sql,1,1,''))
end
go

select *,dbo.f_he(A,B,C) as D from t

drop function f_he
drop table t


A B C D
----------- -------------------- -------------------- --------------------------------------------------
1 E1 6KC F2-CKA,H3-MM
1 F2 CKA E1-6KC,H3-MM
1 H3 MM E1-6KC,F2-CKA
2 44 T2 GH-578
2 GH 578 44-T2

(所影响的行数为 5 行)
回复
bluelazysb 2006-02-10
好像确实不让使用函数
一句sql文真的就实现不了吗?
回复
bluelazysb 2006-02-10
那些地方需要做修改?
能不能写个sample
回复
子陌红尘 2006-02-10
Oracle 10G上能实现,但在语法上需要做相应改动。
回复
bluelazysb 2006-02-10
这个方法在oracle 10g 上能实现吗?
回复
相关推荐
发帖
疑难问题
创建于2007-09-28

2.1w+

社区成员

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