mettre à jour un champ en fonction du sous-total d'une autre table
-
22-07-2019 - |
Question
J'utilise oracle (10).
J'ai deux tables comme suit:
Table1 (uniq rows):
ID AMOUNT DATE
Table2:
ID AMOUNT1 AMOUNT2 ...AMOUNTN DATE
Table2 est connecté plusieurs à un à Table1 connecté via un ID.
Ce dont j'ai besoin, c'est de mettre à jour Table1.DATE avec: la dernière date (la plus ancienne) de la Table2 où Table1.AMOUNT - SUM (Table2.AMOUNT1) < = 0, lors de la lecture de la Table 2 par la Table2 Champ .DATE.
Existe-t-il un moyen simple de le faire?
Merci d'avance!
MISE À JOUR: comme je vois dans vos réponses, j'ai mal spécifié la question. Alors voici un exemple détaillé:
Le tableau 1 contient:
ID: 1 AMOUNT:100 DATE:NULL
La table 2 a (pour l'ID: 1, donc l'ID n'est pas répertorié ici):
AMOUNT1 DATE
50 20080131
30 20080121
25 20080111
20 20080101
Donc, dans ce cas, j'ai besoin de 20080111
comme DATE dans le Tableau 1 sous la forme 50 + 30 + 25 = > 100.
La solution
Sur la base de votre question révisée, c’est un cas d’utilisation des fonctions analytiques.
En supposant que vous vouliez dire > = 100 plutôt que < = 100 comme le suggère votre exemple, et renommer les colonnes DATE en THEDATE puisque DATE est un mot réservé dans 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
)
Si 100 correspond à la valeur actuelle de table1, remplacez cette ligne par:
where v.cumsum >= table1.amount
Autres conseils
Tout d’abord - la structure de votre base de données est gravement fausse, mais j’imagine que vous ne pouvez pas / ne voulez pas le changer. Table1
devrait probablement être une vue, et Table2
ne donne pas l'impression d'une normalisation appropriée. Quelque chose comme (ID, AMOUNT_TYPE, AMOUNT_VALUE, DATE)
aurait beaucoup plus de sens pour moi.
Mais pour résoudre votre problème (c'est la syntaxe T-SQL " UPDATE FROM
&, mais Oracle, je le sais bien):
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