求一语句,尾差处理的。急

lovepp2004 2008-03-06 05:02:24
比如我建立两个表
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语句?急啊。
...全文
378 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
lovepp2004 2008-03-07
  • 打赏
  • 举报
回复
怎么是乱码.上面原话:
谢谢fosjos,bzszp,bzszp让我学习到了多种写法.
DragonBill,最后的是分析函数吧.我以前不知道呢.查了下才知道,谢谢了!
小弟联系方式:
MSN:xuzhg_pei@hotmail.com.QQ:215130459,如果可以请加上吧。新手希望多学习。
lovepp2004 2008-03-07
  • 打赏
  • 举报
回复
ллfosjos��bzszp��DragonBill������֪���˶���д����
DragonBill,���һ���Ƿ���������.����ǰû�ù�.���˲��֪��.��л.
DragonBill 2008-03-07
  • 打赏
  • 举报
回复
这样就可以了

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);
lovepp2004 2008-03-07
  • 打赏
  • 举报
回复
DragonBill:
应该是只更新一个或者更新cb为f,或者更新cb为g,否则最后a中的je和b的sum(je)还是不相等。我也想减少嵌套层数,但是没想到好办法,可否有更好的写法?
DragonBill 2008-03-07
  • 打赏
  • 举报
回复
另: bzszp 的方法是UPDATE cb为f,或者cb为g的记录, 而我写的是 UPDATE cb为f, cb为g的记录, 有一点点小差别
DragonBill 2008-03-07
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 lovepp2004 的回复:]
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);

没有问题。哈哈。刚才看不到回复。我发了一个回复才看到的。受启发,上面应该也对吧。
[/Quote]

//子查询嵌套太多
DragonBill 2008-03-07
  • 打赏
  • 举报
回复

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);
lovepp2004 2008-03-07
  • 打赏
  • 举报
回复
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);

没有问题。哈哈。刚才看不到回复。我发了一个回复才看到的。受启发,上面应该也对吧。
bzszp 2008-03-07
  • 打赏
  • 举报
回复
有问题么?
lovepp2004 2008-03-07
  • 打赏
  • 举报
回复
?????
bzszp 2008-03-06
  • 打赏
  • 举报
回复

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>
fosjos 2008-03-06
  • 打赏
  • 举报
回复
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吧

3,490

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧