表a
name lx          sl ty bz
aaa 1a-12b-13c-22d 2 jf bm
aaa 1a-12b-34d 3 jff bmz
bbb 2a-4b-16d          7 jfff bmzz 表b 
name lx          jf js sx sl ty bz
aaa 1a-12b-13c-22d 1a 12b 1 5 jf bm
aaa 1a-12b-13c-22d 12b 13c 2 2 jf bm
aaa 1a-12b-13c-22d 13c 22d 3 2 jf bm
aaa 1a-12b-34d 12b 34d 2 3 jff bmz
bbb 2a-4b-16d           2a 4b 1 7 jfff bmzz
bbb 2a-4b-16d           4b 16d 2 7 jfff bmzz
 
如何把表a 的 lx 拆分成表b 
如果 name,jf,js,sx 相同的话还要把 sl 合并,第一条记录的 sl 就是拆分完后合并的,只保留其中一个。请高手指点

解决方案 »

  1.   

    with a as(
    select 'aaa' name,'1a-12b-13c-22d' lx,2 sl,'jf' ty,'bm' bz from dual
    union all
    select 'aaa' name,'1a-12b-34d' lx,3 sl,'jff' ty,'bmz' bz from dual
    union all
    select 'bbb' name,'2a-4b-16d' lx,7 sl,'jfff' ty,'bmzz' bz from dual
    )
    , temp as(
    select level lv from dual connect by level < 4
    )
    select name,min(lx) lx,jf,js,sx,sum(sl) sl,min(ty) ty,min(bz) bz from(
    select name,lx,k1 jf,nvl(k2,substr(lx,lv1+1,length(lx))) js,lv sx,sl,ty,bz from(
    select name,lx,lv0,lv1,lv2,k1,k2,lv,sl,ty,bz from(
    select name,lx,lv0,lv1,lv2,substr(lx,lv0+1,lv1-lv0-1) k1,substr(lx,lv1+1,lv2-lv1-1) k2,lv,sl,ty,bz from(
    select name,lx,decode(lv,1,0,instr(lx,'-',1,lv-1)) lv0,instr(lx,'-',1,lv) lv1,instr(lx,'-',1,lv+1) lv2,lv,sl,ty,bz from a,temp
    ) order by name,lx,lv
    ) where k1 is not null
    )
    )group by name,jf,js,sx order by name,lx,sx
      

  2.   

    with a as(
    select 'aaa' name,'1a-12b-13c-22d' lx,2 sl,'jf' ty,'bm' bz from dual
    union all
    select 'aaa' name,'1a-12b-34d' lx,3 sl,'jff' ty,'bmz' bz from dual
    union all
    select 'bbb' name,'2a-4b-16d' lx,7 sl,'jfff' ty,'bmzz' bz from dual
    )
    , temp as(
    select level lv from dual connect by level < 4
    )
    select name,min(lx) lx,jf,js,sx,sum(sl) sl,min(ty) ty,min(bz) bz from(
    select name,lx,k1 jf,nvl(k2,substr(lx,lv1+1,length(lx))) js,lv sx,sl,ty,bz from(
    select name,lx,lv0,lv1,lv2,k1,k2,lv,sl,ty,bz from(
    select name,lx,lv0,lv1,lv2,substr(lx,lv0+1,lv1-lv0-1) k1,substr(lx,lv1+1,lv2-lv1-1) k2,lv,sl,ty,bz from(
    select name,lx,decode(lv,1,0,instr(lx,'-',1,lv-1)) lv0,instr(lx,'-',1,lv) lv1,instr(lx,'-',1,lv+1) lv2,lv,sl,ty,bz from a,temp
    ) order by name,lx,lv
    ) where k1 is not null
    )
    )group by name,jf,js,sx order by name,lx,sx
      

  3.   

    十多万条数据,可能会很慢,但是lx的长度,我的也是不定的啊,
    如果你的lx中有100个'-',你把level增大到101个,不就可以了吗