多行数据转化为一行,有没有比较好的方法?
两个表A、B
表A:
ID Name
1 Rober
2 Luck
表B:
ID Role
1 信息录入员
1 信息审核员
2 广告维护员
2 论坛管理员
2 博客管理员
.
.
关系:表A与表B通过ID一对多关系
需要:
查询出来的效果如下:
1 Rober 信息录入员、信息审核员
2 Luck 广告维护员、论坛管理员、博客管理员....
请高人指点,欢迎顶帖接分!
------解决方案--------------------如果是SQL 2000,就必須借助函數實現。
------解决方案--------------------Create Function F_GetRole(@ID Int)
Returns Nvarchar(2000)
As
Begin
Declare @S Nvarchar(2000)
Select @S = ' '
Select @S = @S + ', ' + Role From B Where ID = @ID
Select @S = Stuff(@S, 1, 1, ' ')
Return @S
End
GO
Select
ID,
Name,
dbo.F_GetRole(ID) As Role
From
A
------解决方案--------------------Create Table A
(ID Int,
Name Varchar(20))
Insert A Select 1, 'Rober '
Union All Select 2, 'Luck '
Create Table B
(ID Int,
Role Nvarchar(20))
Insert B Select 1, N '信息录入员 '
Union All Select 1, N '信息审核员 '
Union All Select 2, N '广告维护员 '
Union All Select 2, N '论坛管理员 '
Union All Select 2, N '博客管理员 '
GO
Create Function F_GetRole(@ID Int)
Returns Nvarchar(2000)
As
Begin
Declare @S Nvarchar(2000)
Select @S = ' '
Select @S = @S + ', ' + Role From B Where ID = @ID
Select @S = Stuff(@S, 1, 1, ' ')
Return @S
End
GO
Select
ID,
Name,
dbo.F_GetRole(ID) As Role
From
A
GO
Drop Table A, B
Drop Function F_GetRole
--Result
/*
ID Name Role
1 Rober 信息录入员,信息审核员
2 Luck 广告维护员,论坛管理员,博客管理员
*/
------解决方案----------------------带符号合并行列转换
--有表t,其数据如下:
a b
1 1
1 2
1 3
2 1
2 2
3 1
--如何转换成如下结果:
a b
1 1,2,3
2 1,2
3 1
create table tb
(
a int,
b int
)
insert into tb(a,b) values(1,1)
insert into tb(a,b) values(1,2)
insert into tb(a,b) values(1,3)
insert into tb(a,b) values(2,1)
insert into tb(a,b) values(2,2)
insert into tb(a,b) values(3,1)
go
if object_id( 'pubs..f_hb ') is not null
drop function f_hb
go
--创建一个合并的函数
create function f_hb(@a int)
returns varchar(8000)
as
begin
declare @str varchar(8000)
set @str = ' '
select @str = @str + ', ' + cast(b as varchar) from tb where a = @a
set @str = right(@str , len(@str) - 1)
return(@str)
End
go
--调用自定义函数得到结果:
select distinct a ,dbo.f_hb(a) as b from tb
drop table tb
--结果
a b
----------- ------
1 1,2,3
2 1,2
3 1
(所影响的行数为 3 行)
多个前列的合并
数据的原始状态如下:
ID PR CON OP SC
001 p c 差 6
001 p c 好 2
001 p c 一般 4