SELECT s.START_Y,s.START_M,s.END_Y,s.END_M,wm_concat(d.dept_name) as dept_name,s.ID FROM T_HZOA_APP_KQSZ s,T_HZDRP_SYS_DEPT d Where (s.organid  like  HZSQL_CONCAT('%',d.id,'%')) group by s.id, s.start_y , s.start_m, s.end_y, s.end_m order by s.START_Y,s.START_M,s.END_Y,s.END_M
查询出来N条数据,其中一个字段不同,别的都相同。
我想得到一条结果,把不同的以“,”分隔,都放到一个字段里。
现在用的是wm_concat方法,但是这个只支持oracle数据库,需求要完全兼容别的数据库的,只能用sql语句写,不能用存储过程之类的,请问该怎么写啊,多谢了!

解决方案 »

  1.   

    oracle用wm_concat.
    sql server 2000用函数.
    sql server 2005如下:/*
    标题:按某字段合并字符串之一(简单合并)
    作者:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开)
    时间:2008-11-06
    地点:广东深圳描述:将如下形式的数据按id字段合并value字段。
    id    value
    ----- ------
    1     aa
    1     bb
    2     aaa
    2     bbb
    2     ccc
    需要得到结果:
    id     value
    ------ -----------
    1      aa,bb
    2      aaa,bbb,ccc
    即:group by id, 求 value 的和(字符串相加)
    */
    --1、sql2000中只能用自定义的函数解决
    create table tb(id int, value varchar(10))
    insert into tb values(1, 'aa')
    insert into tb values(1, 'bb')
    insert into tb values(2, 'aaa')
    insert into tb values(2, 'bbb')
    insert into tb values(2, 'ccc')
    gocreate function dbo.f_str(@id varchar(10)) returns varchar(1000)
    as
    begin
      declare @str varchar(1000)
      select @str = isnull(@str + ',' , '') + cast(value as varchar) from tb where id = @id
      return @str
    end
    go--调用函数
    select id , value = dbo.f_str(id) from tb group by iddrop function dbo.f_str
    drop table tb
    --2、sql2005中的方法
    create table tb(id int, value varchar(10))
    insert into tb values(1, 'aa')
    insert into tb values(1, 'bb')
    insert into tb values(2, 'aaa')
    insert into tb values(2, 'bbb')
    insert into tb values(2, 'ccc')
    goselect id, [value] = stuff((select ',' + [value] from tb t where id = tb.id for xml path('')) , 1 , 1 , '')
    from tb
    group by iddrop table tb
    --3、使用游标合并数据
    create table tb(id int, value varchar(10))
    insert into tb values(1, 'aa')
    insert into tb values(1, 'bb')
    insert into tb values(2, 'aaa')
    insert into tb values(2, 'bbb')
    insert into tb values(2, 'ccc')
    go
    declare @t table(id int,value varchar(100))--定义结果集表变量
    --定义游标并进行合并处理
    declare my_cursor cursor local for
    select id , value from tb
    declare @id_old int , @id int , @value varchar(10) , @s varchar(100)
    open my_cursor
    fetch my_cursor into @id , @value
    select @id_old = @id , @s=''
    while @@FETCH_STATUS = 0
    begin
        if @id = @id_old
           select @s = @s + ',' + cast(@value as varchar)
        else
          begin
            insert @t values(@id_old , stuff(@s,1,1,''))
            select @s = ',' + cast(@value as varchar) , @id_old = @id
          end
        fetch my_cursor into @id , @value
    END
    insert @t values(@id_old , stuff(@s,1,1,''))
    close my_cursor
    deallocate my_cursorselect * from @t
    drop table tb没有通用的.
      

  2.   


    --不是给你说了吗?
    --写个函数去实现。
    create or replace function my_concat(P_ID in varchar2)
    return varchar2
    is
      result    varchar2(4000);
    begin
           for rs in (select NAME from T_HZDRP_SYS_DEPT where ID=P_ID) loop
               result :=result || rs.NAME || ',';
           end loop;
           result := rtrim(result,',');  --去掉最后一个逗号
           return result;
    end;select s.id, s.start_y , s.start_m, s.end_y, s.end_m, MY_CONCAT(d.dept_name) dept_name
    from T_HZOA_APP_KQSZ s, T_HZDRP_SYS_DEPT d  
    where s.organid like '%' || d.id || '%' ;
      

  3.   

    只能用sql语句写的,不能创建方法、存储过程、触发器之类的啊。
      

  4.   


    通用估计不行,每个数据库的连接字符串的表示方式都是不同的,PetShop应用程序都是分开写的,针对每个数据库编写了一个数据库操作层。
      

  5.   

    唉,这个不是项目,是产品,产品的这个模块是公司内部定制工具实现的,现在只让我用sql查询来实现,不准许创建方法存储过程之类的。
      

  6.   

    一条sql走天下的想法是行不通的,不同数据库做不同实现才是正道.