场景如下:我现在有表A的数据,想把表A的数据插入到表B中,然后每插入99行,第100行对前99行的一个字段进行sum操作,其余置空字段字段置空,以此类推循环。最后不足99行的,如剩余40行则第41行对前40行进行和前面一样的操作。请问这种该何如实现啊?我比较新手,希望各位大牛能详尽的指导下。

解决方案 »

  1.   

    太晚了,我就懒得起服务了来测试,你自己试试看吧。create table ta(id number, val number);
    create table tb(id number, val number);--给插入测试数据
    declare
      begin
        for i in 1..210 loop
          insert into ta values(i,i+10);
        end loop;
      end;--把表ta数据按照你的要求复制到表tb,先得到总过需要循环多少遍,然后没循环一次,查询出对应的100条数据,然后union统计的那一行数据,再将这101条数据插入到表tb中去。
    declare
    pages number;
    begin
      select ceil(count(*)/100) into pages from ta;
      for i in 1..pages loop
        insert into tb
          select * from ta where rownum between (i-1)*100+1 and i*100
          union all
          select null id, (select sum(val) from ta where rownum between (i-1)*100+1 and i*100) val from dual;
      end loop;
    end;
      

  2.   

    这要根据真实业务弄。
    一个简单的例子insert into b (
    select col1 ,sum(col1)
    from (select col1,ceil(rownum/99) rn ,rownum from a01)
    group by rollup(rn ,col1));即,按需求把数据分组,然后每99行算一个标识符,根据标识符分组求和汇总
      

  3.   

    首先谢谢你的答复,但是你这个sql还是出现了我当时的问题,我原表大概6000多条数据,大部分的循环间隔都是100行为单位,但是不知为何,总有些阶梯是大于或者小于99行就做了次加合操作。你可以把数据量加大点试试,而且rownum 不能单纯做between吧,记得如果>1的话会报错。
      

  4.   

    问了一些人,好像说是因为是每100行数据批量插入,所以并不知道这第100行的插入顺序,所以会放到中间插入或是尾巴插入不好控制,由oracle的插入算法决定那能不能给个标示符字段来区分哪100行是一起,这样就算将来输出成excel时也能控制吧?求各种大牛现身说法啊
      

  5.   

    SELECT INDCODE,COUNT(1) FROM (
    SELECT INDCODE,CEIL(ROWNUM/6) RN FROM hi_indicators
    )
    GROUP BY ROLLUP(RN,INDCODE)INDCODE                          COUNT(1)               
    -------------------------------- ---------------------- 
    I00000351                        1                      
    I00000352                        1                      
    I00000353                        1                      
    I00000354                        1                      
    I00000355                        1                      
    I00000356                        1                      
                                     6                      
    I00000357                        1                      
    I00000385                        1                      
                                     2                      
                                     8                       选定了 11 行 简单的几个字段应该没问题。
      

  6.   


    确实,看来这个 group by rollup也很棒,我测试下我的数据看看