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

sql 如何寫存儲過程
serialno                 username         編號           主管           時間
BJ-ASH-00272 王凱 154714 劉桂玲 3/8/2007
BJ-ASH-00275 警衛室1 154732 劉桂玲 3/8/2007
BJ-ASH-00275 警衛室2 154732 劉桂玲 3/8/2007
BJ-ASH-00311 方廷燈 159929 馬陽 3/15/2007 BJ-ASH-00312 警衛室1 159980 馬陽 3/15/2007 BJ-ASH-00312 警衛室2 159980 馬陽 3/15/2007

现想做成,   如果serialno相同,   则把username合并起来,其它栏位是一样的,
请教如何实现,   写SQL语句或存储过程都行的.



------解决方案--------------------
又是列聚合。

参考:

/*
表 tbltest

数据如下:

列A 列B 列B
1 1 A
1 1 B
1 1 C
1 2 F
1 2 G
2 1 E
2 1 F
2 2 F

SQL文

结果

列A 列B 列B
1 1 A,B,C
1 2 F,G
2 1 E,F
2 2 F

*/

create table tbltest(列A int, 列B int,列C varchar(100))
go
insert into tbltest
select 1,1, 'A ' union all
select 1,1, 'B ' union all
select 1,1, 'C ' union all
select 1,2, 'F ' union all
select 1,2, 'G ' union all
select 2,1, 'E ' union all
select 2,1, 'F ' union all
select 2,2, 'F '


go
--写一个聚合函数:
create function dbo.fn_Merge(@F1 int,@F2 int)
returns varchar(8000)
as
begin
declare @r varchar(8000)
set @r= ' '
select @r=@r+ ', '+列C from tbltest where 列A=@F1 and 列B=@F2
return stuff(@r,1,1, ' ')
end
go

-- 调用函数
select 列A,列B, dbo.fn_Merge(列A,列B) as 列C from tbltest group by 列A,列B

go
drop table tbltest

go


--方法2(不用函数实现更新、查询)
--如下用于几列合并一列方法1比方法2效率高
declare @tb table(列A int,列B int,列C varchar(50),con int identity(1,1))
insert @tb
select * from ta

begin tran
while exists(select 1 from @tb)
begin
update a
set a.列C=a.列C+ ', '+b.列C
from ta a ,@tb b
where a.列A=b.列A and a.列B=b.列B and
not exists(select * from @tb where 列A=b.列A and 列B=b.列B and con <b.con )

delete b
from @tb b where not exists(select 1 from @tb where 列A=b.列A and 列B=b.列B and con <b.con)
end

select distinct 列A,列B, [列B显示]=stuff(列C,1,charindex( ', ',列C), ' ') from ta
所影响的行数为 1 行)

列A 列B 列B显示
----------- ----------- ----------------------------------------------------------------------------------------------------------------
1 1 A,B,C
1 2 F,G
2 1 E,F
2 2 F

(所影响的行数为 4 行)


drop function fn_Merge
------解决方案--------------------
--带符号合并行列转换

--有表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)