aggiorna un campo basato sul totale parziale da un'altra tabella
-
22-07-2019 - |
Domanda
Sto usando Oracle (10).
Ho due tabelle come segue:
Table1 (uniq rows):
ID AMOUNT DATE
Table2:
ID AMOUNT1 AMOUNT2 ...AMOUNTN DATE
Table2 è collegato da molti a uno a Table1 connesso tramite ID.
Ciò di cui ho bisogno è l'aggiornamento di Table1.DATE con: l'ultima (prima) data da Table2 dove Table1.AMOUNT - SUM (Table2.AMOUNT1) < = 0, quando leggo la tabella 2 all'indietro dalla Table2 Campo .DATE.
C'è un modo semplice per farlo?
Grazie in anticipo!
AGGIORNAMENTO: come vedo dalle tue risposte, avevo specificato un po 'male la domanda. Quindi ecco un esempio dettagliato:
La tabella 1 ha:
ID: 1 AMOUNT:100 DATE:NULL
Tabella 2 ha (per ID: 1, quindi ID non è elencato qui):
AMOUNT1 DATE
50 20080131
30 20080121
25 20080111
20 20080101
Quindi in questo caso ho bisogno di 20080111
come DATA nella Tabella 1 come 50 + 30 + 25 = > 100.
Soluzione
In base alla tua domanda rivista, questo è un caso per l'utilizzo di funzioni analitiche.
Supponendo che intendessi > = 100 anziché < = 100 come suggerisce l'esempio e rinominare le colonne DATE in THEDATE poiché DATE è una parola riservata in 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
)
Se 100 indica il valore corrente di table1, cambia quella riga in:
where v.cumsum >= table1.amount
Altri suggerimenti
Prima di tutto, il layout del tuo database sembra gravemente sbagliato, ma immagino che non puoi / non vuoi cambiarlo. Table1
dovrebbe probabilmente essere una vista e Table2
non dà l'impressione di una normale normalizzazione. Qualcosa come (ID, AMOUNT_TYPE, AMOUNT_VALUE, DATE)
avrebbe molto più senso per me.
Ma per risolvere il tuo problema (questa è T-SQL " UPDATE FROM
" sintassi, ma penso che Oracle lo sappia):
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