有这么一个问题:
 字段名1   字段名2     字段名3
 校长       22          23
 老师       10          12
 学生       10          12现在要求能合并同类别的,也就是把字段名2和字段名3都相同的记录合并。
合并后的结果为
 字段名1   字段名2     字段名3
 校长       22          23
 老师、学生      10          12
想了半天,没有什么好的办法。希望各位高手解答。谢谢

解决方案 »

  1.   

    参考:--生成测试数据
    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
      

  2.   

    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'
    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
    */
      

  3.   

    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也行,这里只是提示你一种新的方式!
      

  4.   

    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 行)
    */
      

  5.   

    谢谢各位热心的解答,可能我没有说清楚,是这样的:
    字段如下,函数的参数不能有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
    如何解答,还请各位高手再解答。谢谢。
      

  6.   

    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',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)
    */
      

  7.   

    谢谢各位热心的解答,可能我没有说清楚,是这样的:
    字段如下,函数的参数不能有class、flag来传递,下面我的列表的数据是通过patient_id,times来得出的。class、flag是查询出来的。不是直接传递的。------------------------------不知道你的原始数据是什么,也不知道你生成这样的数据的SQL,不过我相信针对原始数据写个类似的函数,是可以的。你可以生成静态数据之后,再这样统计。
      

  8.   

    --是不是你要的东东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',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
      

  9.   

    是这样的,我的这些数据是通过patient_id,times来查询出来的。
    class、flag字段是我事先不知道的。就不能用class、flag来传递。原数据集是这样来的
    select name,class,flag from tb where patient_id=@patient_id
    and times=@times得来的。
    得来的数据通过class、flag再来分。
      

  10.   

    不是,楼主根本没有这个TAB,这些数据是查询出来的,叫我们咋整?
      

  11.   

    是这样的,我的这些数据是通过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
      

  12.   

    select dbo.fn_test(class,flag,@patient_id,@times),class,flag from tb where patient_id=@patient_id group by class,flag
      

  13.   

    参数class,flag是我事先不知道的。所以函数的初始变量不能有class,flag.