A表结构
XLMC ZDMC ZDXH
101路 广达集团 1
101路 华北陶瓷 2
101路 公路管理所 3
101路 塘沽中专 4
101路 胡家园 5
101路 滨海客运总站 6
101路 胡北路 7
101路 五车地 8
101路 新河船厂 9
101路 滨海龙都小区 10
101路 塘沽车站 11
101路 实验学校 12
101路 工人新村 13
101路 区政府 14
101路 世纪广场 15
101路 金元宝商厦 16
101路 海河外滩公园 17
101路 东大街 18
101路 新华路 19
101路 公安街 20
101路 塘沽向阳楼 21
101路 老弯道 22
101路 朝阳楼 23
101路 春风里 24
101路 朝阳小学 25
目标表结构
xlmc  zdxx
101路 广达集团,华北陶瓷,公路管理所,塘沽中专,胡家园,滨海客运总站,胡北路,五车地,新河船厂,滨海龙都小区,塘沽车站,实验学校,工人新村,区政府,世纪广场,金元宝商厦,海河外滩公园,东大街,新华路,公安街,塘沽向阳楼,老弯道,朝阳楼,春风里,朝阳小学如何将a转换成目标表的结构?
也就是将A表的ZDMC按ZDXH顺序组成一行。
最好是能直接用sql语句直接实现。
请大虾们帮忙吧!

解决方案 »

  1.   

    select wmsys.wm_concat(ZDMC),XLMC zdxx from A group by XLMC;
      

  2.   

    select b.XLMC,wmsys.wm_concat(b.ZDMC) zdxx from (select * from a order by XLMC,ZDXH)b 
    group by b.XLMC;
      

  3.   

    可以用pl/sql来实现,你思考一下1,定义一个游标CUR1
      select XLMC,ZDMC,ZDXH from A order by XLMC,ZDXH
    2,打开游标CUR1,fetch一条数据到(TMP_XLMC,TMP_ZDMC,TMP_ZDXH),如果是第一次fetch,则设置TMP_KEY_XLMC=TMP_XLMC,TMP_KEY_ZDMC=TMP_ZDMC,如果是第一次以后则进行下面的判断
      IF TMP_XLMC == TMP_KEY_XLMC THEN
          TMP_KEY_ZDMC = TMP_KEY_ZDMC ||','|| TMP_ZDMC;
      ELSE
          INSERT INTO B(xlmc,zdxx) VALUES (TMP_KEY_XLMC,TMP_KEY_ZDMC);
          TMP_KEY_ZDMC = TMP_ZDMC;
          TMP_KEY_XLMC = TMP_XLMC;
      END IF;   
    3,CLOSE游标CUR1,COMMIT;
      

  4.   

    select b.XLMC,wmsys.wm_concat(to_char(b.ZDMC)) zdxx from (select * from a order by XLMC,ZDXH)b 
    group by b.XLMC;有结果了但是 zdxx内容 的顺序变了呢?不是按zdxh拼的字符串啊?
      

  5.   


    select XLMC,WMSYS.WM_CONCAT(ZDMC) from A
    group by XLMC
      

  6.   

    oracle 10以上可以用楼上的方法
    其他的就写存储过程吧
      

  7.   

    select XLMC,WMSYS.WM_CONCAT(ZDMC) from A
    group by XLMC
      

  8.   

    #5楼续不好意思阿,我只有晚上有时间,以下是具体的实现代码:DECLARE
        tmp_xlmc A.xlmc%type;
        tmp_zdmc A.zdmc%type;
        tmp_zdxh A.zdxh%type;
        key_xlmc B.xlmc%type;
        key_zdxx B.zdxx%type;
        CURSOR c0 is
            select xlmc,zdmc,zdxh from A ORDER BY xlmc,zdxh;
    BEGIN
        OPE c0;    FETCH c0 INTO (key_xlmc,key_zdxx,tmp_zdxh);    LOOP
            FETCH c0 INTO (tmp_xlmc,tmp_zdmc,tmp_zdxh);
            EXIT WHEN c0%NOTFOUND;
            
            IF tmp_xlmc=key_xlmc THEN
                key_zdxx := key_zdxx || ',' || tmp_zdmc;
            ELSE
                INSERT INTO B (xlmc,zdxx) values (key_xlmc,key_zdxx);
                key_xlmc := tmp_xlmc;
                key_zdxx := tmp_zdmc;
            END IF;
        END LOOP;    IF key_xlmc IS NOT NULL THEN
            INSERT INTO B(xlmc,zdxx) values(key_xlmc,key_zdxx);
        END IF;    COMMIT;
        CLOSE co;
    END;
    /
      

  9.   

    #10楼修正CLOSE co; =>  CLOSE c0;