日期:2014-05-17  浏览次数:20399 次

求SQL表达式 把一列的数据合在一起,根据其中一个列group
求SQL表达式 把一列的数据合在一起,根据其中一个列group
类似以下结构:
create table tb(姓名 varchar(10),姓名 varchar(10),分数 int)

insert into tb values('张三','语文',74)
insert into tb values('张三','数学',83)
insert into tb values('张三','物理',93)
insert into tb values('李四','语文',74)
insert into tb values('李四','数学',84)
insert into tb values('李四','物理',94)
......................................
......................................
怎么把以上数据变为以下:

姓名    NewString
张三    语文数学物理...
李四    语文数学物理...

------解决方案--------------------
试试这个:

--drop table tb

create table tb(姓名 varchar(10),课程 varchar(10),分数 int)

insert into tb values('张三','语文',74)
insert into tb values('张三','数学',83)
insert into tb values('张三','物理',93)
insert into tb values('李四','语文',74)
insert into tb values('李四','数学',84)
insert into tb values('李四','物理',94)
go

select distinct
       姓名,
       replace((select ','+课程 from tb t where t.姓名 = tb.姓名 for xml path('')),',','') as 课程
from tb
/*
姓名 课程
李四 语文数学物理
张三 语文数学物理
*/

------解决方案--------------------
通用写法
create table tb(姓名 varchar(10),课程 varchar(10),分数 int)

insert into tb values('张三','语文',74)
insert into tb values('张三','数学',83)
insert into tb values('张三','物理',93)
insert into tb values('李四','语文',74)
insert into tb values('李四','数学',84)
insert into tb values('李四','物理',94)


go
if object_id('F_Str') is not null
    drop function F_Str
go
create function F_Str(@Col1 varchar(10))
returns nvarchar(100)
as
begin
    declare @S nvarchar(100)
    select @S=isnull(@S+'','')+课程 from tb where 姓名=@Col1
    return @S
end
go
Select distinct 姓名,NewString=dbo.F_Str(姓名) from tb
/*
姓名         NewString
---------- ----------------------------------------------------------------------------------------------------
李四         语文数学物理
张三         语文数学物理
*/