读书人

怎么合并字段显示

发布时间: 2012-02-15 12:09:44 作者: rapoo

如何合并字段显示
有这么一个问题:
字段名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
[解决办法]
create table test (字段名1 varchar(10),字段名2 int,字段名3 int)
insert test
select '校长 ', '22 ', '23 ' union all
select '老师 ', '10 ', '12 ' union all
select '学生 ', '10 ', '12 '
go

create 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
go

select 字段名1 = dbo.fn_test(字段名2, 字段名3), 字段名2, 字段名3 from test group by 字段名2, 字段名3
go

--删除测试
/*
drop table test
drop function fn_test
*/
[解决办法]
1、使用函数,上边的都说了!

2、使用SQL语句,比如:
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也行,这里只是提示你一种新的方式!
[解决办法]
create table tb(字段名1 varchar(10),字段名2 varchar(10),字段名3 varchar(10))
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 行)
*/
[解决办法]
create table tb(name varchar(50),class varchar(10),flag varchar(10))
insert tb
select '生化组合 ', 'b01 ', 'h011 '
union select '血常规(门诊,静脉) ', 'a01 ', 'h001 '
union select '血常规(限血液、儿科病房) ', 'a01 ', 'h001 '
union select '快速C-反应蛋白 ', 'a01 ',NULL

go

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
end

go

select dbo.f1(class,flag),class,flag from tb group by class,flag

drop table tb
drop function f1


/*

生化组合b01h011
血常规(门诊,静脉)、血常规(限血液、儿科病房)a01h001
快速C-反应蛋白a01NULL b01 h011

(3 row(s) affected)
*/
[解决办法]
谢谢各位热心的解答,可能我没有说清楚,是这样的:
字段如下,函数的参数不能有class、flag来传递,下面我的列表的数据是通过patient_id,times来得出的。class、flag是查询出来的。不是直接传递的。

------------------------------

不知道你的原始数据是什么,也不知道你生成这样的数据的SQL,不过我相信针对原始数据写个类似的函数,是可以的。

你可以生成静态数据之后,再这样统计。
[解决办法]
--是不是你要的东东

create table tb(name varchar(50),class varchar(10),flag varchar(10))
insert tb
select '生化组合 ', 'b01 ', 'h011 '
union select '血常规(门诊,静脉) ', 'a01 ', 'h001 '
union select '血常规(限血液、儿科病房) ', 'a01 ', 'h001 '
union select '快速C-反应蛋白 ', 'a01 ',NULL

go

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
end

go

select dbo.f1(class,flag),class,flag from tb group by class,flag

drop table tb
drop function f1



[解决办法]
是这样的,我的这些数据是通过patient_id,times来查询出来的。
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

读书人网 >SQL Server

热点推荐