请教一句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文怎么写
...全文
179 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
$扫地僧$ 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文实现,怎么办?
新鲜鱼排 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 上能实现吗?

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧