atualizar um campo com base no subtotal de outra tabela
-
22-07-2019 - |
Pergunta
Estou usando o Oracle (10).
Eu tenho duas tabelas da seguinte forma:
Table1 (uniq rows):
ID AMOUNT DATE
Table2:
ID AMOUNT1 AMOUNT2 ...AMOUNTN DATE
Table2 está ligado muitos para um para Table1 conectado via ID.
O que eu preciso é-update ing Table1.DATE com: a última (primeira) data a partir da Table2 onde Table1.AMOUNT - SUM (Table2.AMOUNT1) <= 0, quando a leitura da tabela 2 para trás pelo campo Table2.DATE.
Existe uma maneira simples de fazê-lo?
Agradecemos antecipadamente!
UPDATE: como eu ver a partir de suas respostas que eu tinha mal especificado a questão um pouco. Então aqui vai um exemplo detalhado:
Tabela 1 tem:
ID: 1 AMOUNT:100 DATE:NULL
Tabela2 tem (para ID: 1 de modo ID não estiver listado aqui):
AMOUNT1 DATE
50 20080131
30 20080121
25 20080111
20 20080101
Portanto, neste caso eu preciso 20080111
como a data na Tabela 1 como 50 + 30 + 25 => 100.
Solução
Com base na sua pergunta revista, este é um caso para o uso de funções analíticas.
Assumindo que você quis dizer> = 100 em vez de <= 100 como o seu exemplo implica, e renomeando colunas DATE para thedate desde DATE é uma palavra reservada no 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 os 100 significa que o valor atual de table1 altere essa linha para:
where v.cumsum >= table1.amount
Outras dicas
Em primeiro lugar - o layout do banco de dados se sente seriamente errado, mas eu acho que você não pode / não quer mudá-lo. Table1
provavelmente deve ser uma visão, e Table2
não fazer a impressão de uma normalização adequada. Algo como (ID, AMOUNT_TYPE, AMOUNT_VALUE, DATE)
faria muito mais sentido para mim.
Mas para resolver o seu problema (isto é T-SQL sintaxe "UPDATE FROM
", mas acho que a Oracle sabe disso):
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