根据另一个表的小计更新字段
Posted
技术标签:
【中文标题】根据另一个表的小计更新字段【英文标题】:update a field based on subtotal from another table 【发布时间】:2009-01-13 10:32:33 【问题描述】:我正在使用 oracle(10)。
我有两张表如下:
Table1 (uniq rows):
ID AMOUNT DATE
Table2:
ID AMOUNT1 AMOUNT2 ...AMOUNTN DATE
Table2 与通过 ID 连接的 Table1 多对一连接。
当通过 Table2.DATE 字段向后读取表 2 时,我需要更新 Table1.DATE:Table2 中的最后(最早)日期,其中 Table1.AMOUNT - SUM(Table2.AMOUNT1)
有简单的方法吗?
提前致谢!
更新:我从你的回答中看到,我有点错误地指定了这个问题。所以这里有一个详细的例子:
Table1 有:
ID: 1 AMOUNT:100 DATE:NULL
Table2 有(对于 ID:1,因此 ID 未在此处列出):
AMOUNT1 DATE
50 20080131
30 20080121
25 20080111
20 20080101
所以在这种情况下,我需要 20080111
作为 Table1 中的 DATE 为 50+30+25 => 100。
【问题讨论】:
为什么不提供创建表脚本?这使回答您的问题变得更加容易。为什么你称列“日期”?您不能创建列名为“日期”的表。 我同意tuinstoel,你的问题表达得很含糊,难以理解。起初你说 =)table1.amount吗? 【参考方案1】:根据您修改后的问题,这是使用分析函数的案例。
假设您的意思是 >=100 而不是
update table1 set thedate=
( select max(thedate) from
( select id, thedate,
sum(amount1) over (partition by id order by thedate desc) cumsum
from table2
) v
where v.cumsum >= 100
and v.id = table1.id
)
如果 100 表示 table1 的当前值,则将该行更改为:
where v.cumsum >= table1.amount
【讨论】:
感谢您的帮助 Tony,请注意我不是程序员,仅获得金融学位,并且从像您这样的人那里学到了很多东西,因为我必须与银行软件支持一起工作...您对我帮助很大——如果有人能用简单的话解释它是如何工作的;-)【参考方案2】:首先 - 您的数据库布局感觉严重错误,但我猜您不能/不想更改它。 Table1
应该是一个视图,而Table2
不会给人以正确规范化的印象。像(ID, AMOUNT_TYPE, AMOUNT_VALUE, DATE)
这样的东西对我来说更有意义。
但要解决你的问题(这是T-SQL“UPDATE FROM
”语法,但我认为Oracle知道它):
UPDATE
Table1
SET
Date = Table2Aggregate.MinDate
FROM
Table1
INNER JOIN (
SELECT Id, SUM(Amount1) SumAmount1, MIN(Date) MinDate
FROM Table2
GROUP BY Id
) AS Table2Aggregate ON Table1.Id = Table2Aggregate.ID
WHERE
Table1.Amount - Table2Aggregate.SumAmount1 <= 0
【讨论】:
我已经用一个更详细的例子编辑了这个问题,因为你的例子几乎是一个很好的解决方案,除了 Table2 中有很多 SUM(Amount1) 的情况 - 因为这找到了我看到的最后一个日期...以上是关于根据另一个表的小计更新字段的主要内容,如果未能解决你的问题,请参考以下文章
SQL技巧两则:选择一个表的字段插入另一个表,根据其它表的字段更新本表内容