- 论坛徽章:
- 0
|
0013--如何合并记录
我现在想把几条记录合并成一条,比如
姓名 科目
张三 语文
张三 英语
张三 物理
李四 语文
李四 化学
我想合并成
李四 化学 语文
张三 数学 物理 英语
if object_id(\'tablename\') is not null drop table tablename
select \'张三\' as 姓名, \'语文\' as 科目
into tablename
union select \'张三\', \'数学\'
union select \'张三\', \'英语\'
union select \'张三\', \'物理\'
union select \'李四\', \'语文\'
union select \'李四\', \'化学\'
go
----------------------
if object_id(\'fn_合并\') is not null drop function fn_合并
go
create function fn_合并(
@姓名 varchar(20)
)
returns varchar(300)
as
begin
declare @r varchar(300)
set @r=\'\'
select top 3 @r=@r+\' \'+科目 from tablename where 姓名=@姓名
if @r<>\'\'
set @r=stuff(@r,1,1,\'\')
return @r
end
go
--调用
select 姓名,dbo.fn_合并(姓名) as 科目 from tablename
group by 姓名
drop function fn_合并
drop table tablename
姓名 科目
---- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
李四 化学 语文
张三 数学 物理 英语
(所影响的行数为 2 行)
如下表
A AA1
A AA2
B BB1
B BB2
相应记录合并,并把字段二的合在一块,得出的结果为
A AA1,AA2
B BB1,BB2
create table csdn(id char(10),txt varchar(10))
insert csdn
select \'A\',\'AA1\' union all
select \'A\',\'AA2\' union all
select \'B\',\'BB1\' union all
select \'B\',\'BB2\'
select * from csdn
go
create function Gettxt(@id char)
returns varchar(8000)
as
begin
declare @s varchar(8000)
set @s=\'\'
select @s=@s +\',\' +txt from csdn where id=@id
--return @s
return stuff(@s,1,1,\'\')
end
go
select id,dbo.Gettxt(id) txt from csdn group by id
go
drop function Gettxt
drop table csdn
go
id txt
---------- ---------
A AA1,AA2
B BB1,BB2
(所影响的行数为 2 行)
有一个表X:
name pre1 pre2 pre3
A 11 12 13
A 21 22 23
B 31 32 33
B 41 42 43
C 51 52 53
C 61 62 63
.....
.....
我希望能把其中的元素选出来放到另一个表Y中,Y只有一行一列:结构如下:
ALL
A-11-12-13-21-22-23
B-31-32-33-41-42-43
C-51-52-53-61-62-63
.....
x表可能有几千行,但是列数一定,在Y表中通过“-”和回车合在了一起,怎么实现呢?
create table x (
name varchar(10),
pre1 varchar(10),
pre2 varchar(10),
pre3 varchar(10)
)
insert x
select \'A\', \'11\', \'12\', \'13\' union all
select \'A\', \'21\', \'22\', \'23\' union all
select \'B\', \'31\', \'32\', \'33\' union all
select \'B\', \'41\', \'42\', \'43\' union all
select \'C\', \'51\', \'52\', \'53\' union all
select \'C\', \'61\', \'62\', \'63\'
go
create function fn_all(
@name varchar(20)
)
returns varchar(300)
as
begin
declare @r varchar(300)
set @r=@name
select @r=@r+\'-\'+ pre1 + \'-\' + pre2 + \'-\' + pre3 from x where name=@name
return @r
end
go
--调用
select dbo.fn_all(name) as [All] from x
group by name
--删除环境
drop function dbo.fn_all
go
drop table x
go
All
-------------------
A-11-12-13-21-22-23
B-31-32-33-41-42-43
C-51-52-53-61-62-63
(所影响的行数为 3 行) |
|