表A
id      data
1       0001
2       0003+0005
3       0006:0008
4       0011+0013:0016+0020要变成
表B
id      data 
1       0001
2       0003
2       0005
3       0006
3       0007
3       0008
4       0011
4       0013
4       0014
4       0015
4       0016
4       0020 也就是+表示单个的,:表示连续的...想了半天也没想到一个好的解决方案....

解决方案 »

  1.   

    忘了说了,data这边的位数是确定的,4位.
      

  2.   


    看看下面这种,是不是你想要的
    select sjbm,dsbm,qxbm,sum(sb_zzs)
    from v_bd
    group by sjbm,dsbm,rollup(qxbm);select sjbm,dsbm,qxbm,sum(sb_zzs)
    from v_bd
    group by sjbm,rollup(dsbm,qxbm);
      

  3.   

    确实bt,建议你还是先倒入个Excel文件,(倒两次,一次定义用"+"做分割符,一次用":"做分割符,)然后手工对那些还不符合的数据修改下,再反向倒进数据库.
      

  4.   

    以下过程可以实现折分“0011+0013:0016+0020”这样的字符串,具体怎样实现插入我就不写了
    另外该过程有一个BUG,就是如果 “:”后边的数据小于前边的数据如“0012:0009”将会出错,
    你可以加上一个判断
    create or replace procedure split_data(p_var varchar) as 
    v_len number;
    v_con number;
    v_char varchar2(1);
    v_l number;
    v_var varchar(4);
    begin
         v_len := length(p_var);
         v_con := mod(v_len,4);
         dbms_output.put_line('length: ' || v_len || ' count:' || v_con);
         if(v_con > 0) then
                  for i in 1 .. v_con loop
                      v_char := substr(p_var,i*5,1);
                      if(v_char = '+') then
                          dbms_output.put_line(substr(p_var,(i-1)*5+1,4));
                      elsif(v_char = ':') then
                          for j in to_number(substr(p_var,(i-1)*5+1,4)) .. to_number(substr(p_var,i*5+1,4)) loop
                              v_l := length(to_char(j));
                              if v_l < 4 then
                                 v_var := to_char(j);
                                 for k in 1 .. 4-v_l loop
                                     v_var := '0' || v_var;
                                 end loop;
                                 dbms_output.put_line(v_var);
                              else
                                 dbms_output.put_line(j);
                              end if;
                          end loop;
                      end if;
                  end loop;
         else
             dbms_output.put_line(p_var);
         end if;
    end;