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)