比如我建立两个表
create  table a
(
       cbzx char(1),
       JE   decimal(20,8)
)
/
create  table b
(
       cb char(1),
       ly char(1),
       je decimal(20,8)
)
/
insert into a 
select 'a',200 from dual
union all select 'b',300 from dual
/
insert into b
select 'c','a',150 from dual
union all select 'd','a',25 from dual
union all select 'e','a',24.99999 from dual
union all select 'f','b',100.99999 from dual
union all select 'g','b',100.99999 from dual
union all select 'h','b',96.99999 from dual一表中a为200,b为300,表2中ly为a的je之和为199.99999,还差0.00001,如何通过语句调整到je最大的一个上,也就是150那个变为150.00001,同理,表1中b为300,而表2种je还差1.00003,如何调整到ly为b的je最大的一个上,也就是cb为f,或者cb为g那条上面。
希望大家帮忙。用游标比较容易实现,关键是用sql语句?急啊。

解决方案 »

  1.   

    select b0.ly, b0.total, b0.je, a.je,
      ( select cb from b where je=b0.je and ly=b0.ly and rownum=1 )cb
    from
      ( select ly, sum(je) total, max(je) je from b group by ly )b0, a
    where b0.ly=a.cbzx已列出
    表b的ly, je总和, 最大je, 最大je对应的cb, 表a中对应的je
    应该可以update吧
      

  2.   


    SQL> SELECT * FROM B;C L        JE
    - - ---------
    c a       150
    d a        25
    e a  24.99999
    f b 100.99999
    g b 100.99999
    h b  96.99999已选择6行。
    SQL> UPDATE B SET B.JE=B.JE+(
      2  SELECT A.JE-SUM(BB.JE) FROM A,B BB WHERE A.CBZX=BB.LY AND A.CBZX=B.LY GROUP BY A.JE
      3  )
      4  WHERE (CB,LY) IN (
      5  SELECT MAX(CB),LY FROM B WHERE (LY,JE) IN (SELECT LY,MAX(JE) FROM B GROUP BY LY) 
      6  GROUP BY LY);已更新2行。SQL> SELECT * FROM B;C L        JE
    - - ---------
    c a 150.00001
    d a        25
    e a  24.99999
    f b 100.99999
    g b 102.00002
    h b  96.99999已选择6行。SQL> 
      

  3.   

    UPDATE B SET B.JE=B.JE+(
    SELECT A.JE-SUM(BB.JE) FROM A,B BB WHERE A.CBZX=BB.LY AND A.CBZX=B.LY GROUP BY A.JE
    )
    WHERE rowid in (
    SELECT max(rowid) FROM B WHERE (LY,JE) IN (SELECT LY,MAX(JE) FROM B GROUP BY LY) 
    GROUP BY LY);没有问题。哈哈。刚才看不到回复。我发了一个回复才看到的。受启发,上面应该也对吧。
      

  4.   


    UPDATE B SET JE = JE + (
                            SELECT MAX(A.JE) - SUM(InnerB.JE)
                            FROM A, B InnerB 
                            WHERE A.CBZX = InnerB.LY AND InnerB.LY = B.LY
                            GROUP BY LY)                       
    WHERE (LY, JE) IN (SELECT LY, MAX(JE) OVER (PARTITION BY LY) FROM B);
      

  5.   

    另: bzszp 的方法是UPDATE cb为f,或者cb为g的记录, 而我写的是 UPDATE cb为f, cb为g的记录, 有一点点小差别
      

  6.   

    DragonBill:
    应该是只更新一个或者更新cb为f,或者更新cb为g,否则最后a中的je和b的sum(je)还是不相等。我也想减少嵌套层数,但是没想到好办法,可否有更好的写法?
      

  7.   

    这样就可以了UPDATE B SET JE = JE + (
                            SELECT MAX(A.JE) - SUM(InnerB.JE)
                            FROM A, B InnerB 
                            WHERE A.CBZX = InnerB.LY AND InnerB.LY = B.LY
                            GROUP BY LY)                       
     WHERE (LY, JE, CB || '1') IN (SELECT LY, 
                                  MAX(JE) OVER (PARTITION BY LY),
                                  CB || ROW_NUMBER() OVER (PARTITION BY LY ORDER BY JE DESC)
                            FROM B);
      

  8.   

    ллfosjos��bzszp��DragonBill������֪���˶���д����
    DragonBill,���һ���Ƿ���������.����ǰû�ù�.���˲��֪��.��л.