create table ta (dm int, mc varchar(10))
insert ta
select 1, 'ABC' union all
select 2, 'CD' union all
select 3, 'CE' union all
select 3, 'CEB' union all
select 1, 'A' --楼主少一个A值
create FUNCTION dbo.f_str(@dm int)
RETURNS varchar(8000)
AS
BEGIN
DECLARE @sql varchar(8000)
SET @sql = ''
SELECT @sql = @sql + lower(mc)+'/'
FROM ta
WHERE dm=@dm
set @sql = left(@sql,len(@sql) - 1)
return(@sql)
end
select dm,内容=dbo.f_str(dm) from ta group by dm
dm 内容
----------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1 abc/a
2 cd
3 ce/ceb
(所影响的行数为 3 行)
--drop table ta
--drop function f_str
if object_id('pubs..t') is not null
drop table t
go
create table t(dm int,mc varchar(10))
insert into t(dm,mc) values(1,'ABC')
insert into t(dm,mc) values(2,'CD')
insert into t(dm,mc) values(3,'CE')
insert into t(dm,mc) values(3,'CEB')
insert into t(dm,mc) values(1,'A')
go
--创建一个合并的函数f_hb
if object_id('pubs..f_hb') is not null
drop function f_hb
go
create function f_hb(@dm int)
returns varchar(8000)
as
begin
declare @str varchar(8000)
set @str = ''
select @str = @str + ',' + cast(mc as varchar) from t where dm = @dm
set @str = right(@str , len(@str) - 1)
return(@str)
End
go
--调用自定义函数得到结果:
select distinct dm ,dbo.f_hb(dm) as mc from t
drop table t
drop function f_hb
--结果
dm mc
----------- ------
1 ABC,A
2 CD
3 CE,CEB
用函数
CREATE TABLE tb([dm] int, [mc] varchar(100))
INSERT INTO tb
SELECT 1, 'ABC'
UNION ALL SELECT 2, 'CD'
UNION ALL SELECT 3, 'CE'
UNION ALL SELECT 3, 'CEB'
UNION ALL SELECT 1, 'A'
GO
CREATE FUNCTION AddStr(@dm INT)
RETURNS VARCHAR(100)
AS
BEGIN
DECLARE @re VARCHAR(100)
SET @re = ''
SELECT @re = @re + ISNULL(MC, '') +'/' FROM tb WHERE dm = @dm
RETURN LEFT(@re,LEN(@re) -1)
END
GO
有表rowtocol,其数据如下:
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 function f_rowtocol(@a int)
returns varchar(8000)
as
begin
declare @str varchar(8000)
set @str = ''
select @str = @str + ',' + cast(b as varchar) from rowtocol where a = @a
set @str = right(@str , len(@str) - 1)
return(@str)
End
go