根据另一个表的小计更新字段
-
22-07-2019 - |
题
我正在使用甲骨文(10)。
我有两个表如下:
Table1 (uniq rows):
ID AMOUNT DATE
Table2:
ID AMOUNT1 AMOUNT2 ...AMOUNTN DATE
Table2 通过 ID 与 Table1 多对一连接。
我需要的是更新 Table1.DATE :当按 Table2.DATE 字段向后读取表 2 时,Table2 中的最后(最早)日期,其中 Table1.AMOUNT - SUM(Table2.AMOUNT1) <= 0。
有简单的方法吗?
提前致谢!
更新: 正如我从你的回答中看到的,我有点错误地指定了这个问题。这是一个详细的例子:
表1有:
ID: 1 AMOUNT:100 DATE:NULL
表2有(对于ID:1 因此此处未列出 ID):
AMOUNT1 DATE
50 20080131
30 20080121
25 20080111
20 20080101
所以在这种情况下我需要 20080111
表 1 中的日期为 50+30+25 => 100。
解决方案
根据您修改后的问题,这是使用分析函数的情况。
假设您的意思是 >=100 而不是 <= 100,如您的示例所示,并将列 DATE 重命名为 THEDATE,因为 DATE 是 Oracle 中的保留字:
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
其他提示
第一关 - 你的数据库布局感到严重错误的,但我猜你不能/不想去改变它。 Table1
大概应该是一个视图,Table2
不作适当正常化的印象。像(ID, AMOUNT_TYPE, AMOUNT_VALUE, DATE)
东西将使更多的意义在我身上。
但是,解决你的问题(这是T-SQL “UPDATE FROM
” 语法,但我认为它知道它):
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
不隶属于 StackOverflow