actualizar un campo basado en el subtotal de otra tabla
-
22-07-2019 - |
Pregunta
Estoy usando Oracle (10).
Tengo dos tablas de la siguiente manera:
Table1 (uniq rows):
ID AMOUNT DATE
Table2:
ID AMOUNT1 AMOUNT2 ...AMOUNTN DATE
Table2 está conectado muchos a uno a Table1 conectado a través de ID.
Lo que necesito es actualizar Table1.DATE con: la última (más temprana) fecha de Table2 donde Table1.AMOUNT - SUM (Table2.AMOUNT1) < = 0, al leer la tabla 2 al revés de Table2 .FECHA campo.
¿Hay una manera simple de hacerlo?
¡Gracias de antemano!
ACTUALIZACIÓN: como veo en sus respuestas, especifiqué un poco la pregunta. Así que aquí va un ejemplo detallado:
Tabla1 tiene:
ID: 1 AMOUNT:100 DATE:NULL
Table2 tiene (para ID: 1, por lo que la ID no figura aquí):
AMOUNT1 DATE
50 20080131
30 20080121
25 20080111
20 20080101
Entonces, en este caso, necesito 20080111
como FECHA en la Tabla1 como 50 + 30 + 25 = > 100.
Solución
Basado en su pregunta revisada, este es un caso para usar funciones analíticas.
Suponiendo que quiso decir > = 100 en lugar de < = 100 como su ejemplo lo indica, y renombrando las columnas DATE a THEDATE ya que DATE es una palabra reservada en 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 significa el valor actual de table1, cambie esa línea a:
where v.cumsum >= table1.amount
Otros consejos
Primero, el diseño de su base de datos se siente muy mal, pero supongo que no puede / no quiere cambiarlo. Table1
probablemente debería ser una vista, y Table2
no da la impresión de una normalización adecuada. Algo así como (ID, AMOUNT_TYPE, AMOUNT_VALUE, DATE)
tendría mucho más sentido para mí.
Pero para resolver su problema (esto es T-SQL " UPDATE FROM
" sintaxis, pero creo que Oracle lo sabe):
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