interpretierte ich das Problem im Sinne von „ein paar mehr Spalten der Tabelle B add“ - den „aktuellen“ Prozentsatz zu zeigen, das Datum aus Tabelle A zeigt, und die „Bruttomenge“ aus der Tabelle B und die "Nettomenge" durch Multiplikation mit dem richtigen Prozentsatz.
Wenn Sie auch für jede Zeile in Tabelle A eine Zeile benötigen, löschen Sie einfach die WHERE
-Klausel aus der äußersten Abfrage (am Ende der Abfrage).
with table_a (id, dt, pct) as (
select 'A', to_date('01/01/17', 'mm/dd/rr'), 0.5 from dual union all
select 'A', to_date('04/01/17', 'mm/dd/rr'), 1 from dual union all
select 'A', to_date('06/01/17', 'mm/dd/rr'), 2 from dual union all
select 'B', to_date('02/01/17', 'mm/dd/rr'), 5 from dual union all
select 'B', to_date('05/01/17', 'mm/dd/rr'), 10 from dual
), table_b (id, dt, qty) as (
select 'A', to_date('01/01/17', 'mm/dd/rr'), 10 from dual union all
select 'A', to_date('02/01/17', 'mm/dd/rr'), 20 from dual union all
select 'A', to_date('03/01/17', 'mm/dd/rr'), 30 from dual union all
select 'A', to_date('05/01/17', 'mm/dd/rr'), 40 from dual union all
select 'A', to_date('06/01/17', 'mm/dd/rr'), 50 from dual union all
select 'A', to_date('07/01/17', 'mm/dd/rr'), 60 from dual union all
select 'A', to_date('08/01/17', 'mm/dd/rr'), 40 from dual union all
select 'B', to_date('01/01/17', 'mm/dd/rr'), 10 from dual union all
select 'B', to_date('02/01/17', 'mm/dd/rr'), 50 from dual
)
-- end of test data (not part of the SQL query); query begins BELOW THIS LINE
select id, qty_date, pct_date, qty as gross_qty, pct, qty * pct as net_qty
from (select id, dt as qty_date,
last_value(case flag when 0 then dt end ignore nulls)
over (partition by id order by dt) as pct_date,
last_value(pct ignore nulls)
over (partition by id order by dt, flag) as pct,
qty, flag
from (select id, dt, pct, null as qty, 0 as flag
from table_a
union all
select id, dt, null as pct, qty, 1 as flag
from table_b
)
)
where flag = 1
order by id, qty_date -- if needed
;
Output:
ID QTY_DATE PCT_DATE GROSS_QTY PCT NET_QTY
-- ---------- ---------- ---------- ---------- ----------
A 2017-01-01 2017-01-01 10 .5 5
A 2017-02-01 2017-01-01 20 .5 10
A 2017-03-01 2017-01-01 30 .5 15
A 2017-05-01 2017-04-01 40 1 40
A 2017-06-01 2017-06-01 50 2 100
A 2017-07-01 2017-06-01 60 2 120
A 2017-08-01 2017-06-01 40 2 80
B 2017-01-01 10
B 2017-02-01 2017-02-01 50 5 250
9 rows selected.
Die "Ausgang" -Tabelle (??) zeigt eine Zeile für das Datum 04/01/17, das in entweder der Eingangstabellen nicht vorhanden ist. WARUM? Ist das ein Teil der Anforderung? Wenn dies der Fall ist, aktualisieren Sie den Beitrag, um dies explizit zu machen. – mathguy
@mathguy: 04/01/17 ist in der zweiten Zeile der Tabelle A. ??? –
@BobJarvis - Ugh. Ich meinte wirklich in Tabelle B. Allgemeiner - gibt es eine Anforderung, dass alle Monate im Endergebnis vorhanden sind? Aber dann habe ich mir den Rest der Ausgabe angeschaut und es macht keinen Sinn. Was ist zum Beispiel mit 5/5/17? (letzte Reihe in der Ausgabe) Ich entschied, die "Ausgabe" zu ignorieren und das Problem "mein Weg" zu interpretieren. – mathguy