有这么一个问题:
字段名1 字段名2 字段名3
校长 22 23
老师 10 12
学生 10 12现在要求能合并同类别的,也就是把字段名2和字段名3都相同的记录合并。
合并后的结果为
字段名1 字段名2 字段名3
校长 22 23
老师、学生 10 12
想了半天,没有什么好的办法。希望各位高手解答。谢谢
字段名1 字段名2 字段名3
校长 22 23
老师 10 12
学生 10 12现在要求能合并同类别的,也就是把字段名2和字段名3都相同的记录合并。
合并后的结果为
字段名1 字段名2 字段名3
校长 22 23
老师、学生 10 12
想了半天,没有什么好的办法。希望各位高手解答。谢谢
create table 表(部门 int,人员 varchar(20))
insert into 表 select 1,'张三'
insert into 表 select 1,'李四'
insert into 表 select 1,'王五'
insert into 表 select 2,'赵六'
insert into 表 select 2,'邓七'
insert into 表 select 2,'刘八'
go--创建用户定义函数
create function f_str(@department int)
returns varchar(8000)
as
begin
declare @ret varchar(8000)
set @ret = ''
select @ret = @ret+','+人员 from 表 where 部门 = @department
set @ret = stuff(@ret,1,1,'')
return @ret
end
go
--执行
select 部门,人员=dbo.f_str(部门) from 表 group by 部门 order by 部门
go--输出结果
/*
部门 人员
---- --------------
1 张三,李四,王五
2 赵六,邓七,刘八
*/
--删除测试数据
drop function f_str
drop table 表
go
insert test
select '校长','22','23' union all
select '老师','10','12' union all
select '学生','10','12'
gocreate function fn_test(@字段名2 int, @字段名3 int)
returns varchar(8000)
as
begin
declare @return varchar(8000)
select @return = coalesce(@return+'、', '') + 字段名1 from test where 字段名2 = @字段名2 and 字段名3 = @字段名3
return (@return)
end
goselect 字段名1 = dbo.fn_test(字段名2, 字段名3), 字段名2, 字段名3 from test group by 字段名2, 字段名3
go--删除测试
/*
drop table test
drop function fn_test
*/
declare @sql varchar(100)
create table tab1(id varchar(2),name varchar(10))
insert tab1
select '01','张三'
union
select '02','李四'
set @sql=''
select @sql=@sql+'、'+name from tab1
select stuff(@sql,1,1,'')
drop table tab1
(2 行受影响)---------------------------------------------------------------------------------------------------
张三、李四(1 行受影响)3、如果里面有null的话,可以使用函数coalesce,例如:
declare @sql varchar(100)
create table tab1(id varchar(2),name varchar(10))
insert tab1
select '01','张三'
union
select '02','李四'
set @sql=''select @sql=coalesce(@sql,'')+'、'+name from tab1
select stuff(@sql,1,1,'')
drop table tab1(2 行受影响)---------------------------------------------------------------------------------------------------
张三、李四(1 行受影响)当然了,用isnull也行,这里只是提示你一种新的方式!
insert into tb values('校长', '22', 23)
insert into tb values('老师', '10', 12)
insert into tb values('学生', '10', 12)
go
--创建一个合并的函数
create function f_hb(@字段名2 varchar(10),@字段名3 varchar(10))
returns varchar(8000)
as
begin
declare @str varchar(8000)
set @str = ''
select @str = @str + ',' + cast(字段名1 as varchar) from tb where 字段名2 = @字段名2 and 字段名3 = 字段名3
set @str = right(@str , len(@str) - 1)
return(@str)
End
go--调用自定义函数得到结果:
select distinct 字段名2,字段名3 ,dbo.f_hb(字段名2,字段名3) as 字段名1 from tb
drop table tb
drop function f_hb/*
字段名2 字段名3 字段名1
---------- ---------- ---------
10 12 老师,学生
22 23 校长(所影响的行数为 2 行)
*/
字段如下,函数的参数不能有class、flag来传递,下面我的列表的数据是通过patient_id,times来得出的。class、flag是查询出来的。不是直接传递的。
name class flag
生化组合 b01 h011
血常规(门诊,静脉) a01 h001
血常规(限血液、儿科病房) a01 h001
快速C-反应蛋白 a01 NULL
有这样的项目,我需要根据后面的字段class,flag字段来合并name来显示。
如class、flag完全一样就合并显示、不一样就分开显示。结果为
生化组合 b01 h011
血常规(门诊,静脉)、血常规(限血液、儿科病房) a01 h001
快速C-反应蛋白 a01 NULL
如何解答,还请各位高手再解答。谢谢。
insert tb
select '生化组合','b01','h011'
union select '血常规(门诊,静脉)','a01','h001'
union select '血常规(限血液、儿科病房)','a01','h001'
union select '快速C-反应蛋白','a01',NULLgo create function f1(@class varchar(10),@flag varchar(10))
returns varchar(8000)
as
begin
declare @str varchar(8000)
set @str=''
select @str=@str+','+[name] from tb where class=@class and isnull(flag,'')=isnull(@flag,'')
set @str=stuff(@str,1,1,'')
return @str
endgoselect dbo.f1(class,flag),class,flag from tb group by class,flagdrop table tb
drop function f1
/*生化组合 b01 h011
血常规(门诊,静脉)、血常规(限血液、儿科病房) a01 h001
快速C-反应蛋白 a01 NULL b01 h011(3 row(s) affected)
*/
字段如下,函数的参数不能有class、flag来传递,下面我的列表的数据是通过patient_id,times来得出的。class、flag是查询出来的。不是直接传递的。------------------------------不知道你的原始数据是什么,也不知道你生成这样的数据的SQL,不过我相信针对原始数据写个类似的函数,是可以的。你可以生成静态数据之后,再这样统计。
insert tb
select '生化组合','b01','h011'
union select '血常规(门诊,静脉)','a01','h001'
union select '血常规(限血液、儿科病房)','a01','h001'
union select '快速C-反应蛋白','a01',NULLgo create function f1(@class varchar(10),@flag varchar(10))
returns varchar(8000)
as
begin
declare @str varchar(8000)
set @str=''
select @str=@str+','+[name] from tb where isnull(class,'')=isnull(@class,'') and isnull(flag,'')=isnull(@flag,'')
set @str=stuff(@str,1,1,'')
return @str
endgoselect dbo.f1(class,flag),class,flag from tb group by class,flagdrop table tb
drop function f1
class、flag字段是我事先不知道的。就不能用class、flag来传递。原数据集是这样来的
select name,class,flag from tb where patient_id=@patient_id
and times=@times得来的。
得来的数据通过class、flag再来分。
class、flag字段是我事先不知道的。就不能用class、flag来传递。原数据集是这样来的
select name,class,flag from tb where patient_id=@patient_id
and times=@times得来的。
得来的数据通过class、flag再来分。
-----------------------------那还不一样?create function fn_test(class int, @flag int, @patient_id int, @times int)
returns varchar(8000)
as
begin
declare @return varchar(8000)
select @return = coalesce(@return+'、', '') + name from tb where patient_id=@patient_id and times=@times and class = @class and flag = @flag
return (@return)
end
go