日期:2014-05-18  浏览次数:20416 次

如何把列的内容distinct后,再横向表示?不要使用@sql变量
哪位大兄弟能用一条sql语句写出来,不要使用@sql变量。小弟拜一下!

-----------------------------
比如说数据库信息:

aaaa         a1         007
aaaa         a1         008
aaaa         a2         007
aaaa         a3         009
bbbb         b1         007
bbbb         b2         007
bbbb         b2         008
-----------------------------
我希望得到的格式:

aaaa         a1,a2,a3
bbbb         b1,b2
-----------------------------



------解决方案--------------------
不用变量是不能解决问题的
------解决方案--------------------
SQL2000的話,最好是寫function
------解决方案--------------------
GO
create function fn_test(@c1 varchar(10))
returns varchar(50)
AS
begin
declare @str varchar(50)
set @str= ' '
select @str=@str+ ', '+c2 from (select distinct c1,c2 from T) a where c1=@c1
if len(@str)> 1
set @str=stuff(@str,1,1, ' ')
return @str
end

GO

select c1,dbo.fn_test(c1) as c2
from T
group by c1
------解决方案--------------------
create function fmerg(@col varchar(20))
returns varchar(8000)
as
begin
declare @str varchar(8000)
set @str= ' '
select @str=@str+ ', '+cast(col2 as varchar) from t where col1=@col
group by col2
set @str=right(@str,len(@str)-1)
return(@str)
End
go

create table t(col1 varchar(20),col2 varchar(10),col3 varchar(10))
insert t select 'aaaa ', 'a1 ', '007 '
union all select 'aaaa ', 'a1 ', '008 '
union all select 'aaaa ', 'a2 ', '007 '
union all select 'aaaa ', 'a3 ', '009 '
union all select 'bbbb ', 'b1 ', '007 '
union all select 'bbbb ', 'b2 ', '007 '
union all select 'bbbb ', 'b2 ', '008 '
go

select distinct col1,col2=dbo.fmerg(col1) from t

drop table t
drop function dbo.fmerg

结果:
aaaa a1,a2,a3
bbbb b1,b2


------解决方案--------------------
create table t(col1 varchar(10), col2 varchar(5),col3 varchar(5))

insert into t select 'aaaa ', 'a1 ', '007 '
insert into t select 'aaaa ', 'a1 ', '008 '
insert into t select 'aaaa ', 'a2 ', '007 '
insert into t select 'aaaa ', 'a3 ', '009 '
insert into t select 'bbbb ', 'b1 ' , '007 '
insert into t select 'bbbb ', 'b2 ', '007 '
insert into t select 'bbbb ', 'b2 ', '008 '


declare @name varchar(10)
declare @s varchar(5)
--定义表变量,去掉col2重复值
declare @tb table(col1 varchar(10),col2 varchar(100))
insert into @tb select distinct col1,col2 from t
--定义表变量,保存游标结果