凯锐

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::

行列轉換的經典解答[整理自IT PUB]

select * from v_temp
上面的视图结果如下:
user_name role_name
-------------------------
系统管理员 管理员
feng 管理员
feng 一般用户
test 一般用户


想把结果变成这样:
user_name role_name
---------------------------
系统管理员 管理员
feng 管理员,一般用户
test 一般用户

解決方案﹕
A﹑建立測試數據表
create table a_test(name varchar(20),role2 varchar(20))

insert into a_test values('李','管理員')
insert into a_test values('張','管理員')
insert into a_test values('張','一般用戶')
insert into a_test values('常','一般用戶')

B﹑解決方法
一﹕
create function uf_test(@n varchar(30))
returns varchar(99)
as
--select distinct name,dbo.uf_test(name) from a_test
begin
declare cur_role2 cursor local for select role2 from a_test where name =@n
declare @r varchar(30),@ret varchar(99)
open cur_role2
fetch cur_role2 into @r
while @@fetch_status = 0
begin
if @ret is null
select @ret = @r
else
select @ret = @ret + ',' +@r
fetch cur_role2 into @r
end
close cur_role2
return @ret
end
Go
二(IT PUB中公認最好的方法)
create function join_str(@content varchar(100))
returns varchar(2000)
as
--select [name],dbo.join_str([name]) role2 from a_test group by [name]
begin
declare @str varchar(2000)
set @str=''
select @str=@str+','+rtrim(role2) from a_test where [name]=@content
select @str=right(@str,len(@str)-1)
return @str
end
go


posted on 2006-03-03 20:58  凯锐  阅读(268)  评论(0)    收藏  举报