create table bestellungen
as
select 1 artnr, to_date('01.02.2020', 'dd.mm.yyyy') datum, 25 menge
from dual
Table created.
create table preislisten
as
select 1 artnr, to_date('01.01.2019', 'dd.mm.yyyy') datumvon, 'L1' lieferanntennr, 10 menge_ab, 1 einkaufspreis from dual union all
select 1 artnr, to_date('01.01.2019', 'dd.mm.yyyy') datumvon, 'L1' lieferanntennr, 100 menge_ab, 0.8 einkaufspreis from dual union all
select 1 artnr, to_date('01.08.2018', 'dd.mm.yyyy') datumvon, 'L2' lieferanntennr, 20 menge_ab, 0.9 einkaufspreis from dual
ORA-00955: name is already used by an existing objectMore Details: https://docs.oracle.com/error-help/db/ora-00955
with cheapest_supplier_overall as
(
select x.artnr, x.lieferantennr, x.menge_ab, x.einkaufspreis
from (
select p.*, row_number() over (partition by artnr order by einkaufspreis) rang
from preislisten p
) x
where x.rang = 1
),
cheapest_supplier_for_order as
(
select x.artnr, x.datum, x.menge, x.lieferantennr, x.menge_ab, x.einkaufspreis
from (
select b.artnr, b.datum, b.menge, p.lieferantennr, p.menge_ab, p.einkaufspreis, row_number() over (partition by b.artnr order by p.einkaufspreis) rang
from bestellungen b
join preislisten p
on ( p.artnr = b.artnr
and p.menge_ab <= b.menge
)
) x
where x.rang = 1
)
select a.artnr, a.datum, a.menge,
a.lieferantennr lieferant1,
a.menge_ab lieferant1_ab_menge,
a.einkaufspreis lieferant_1_einkaufspreis,
b.lieferantennr lieferant2,
b.menge_ab lieferant2_ab_menge,
b.einkaufspreis lieferant2_einkaufspreis
from cheapest_supplier_for_order a
join cheapest_supplier_overall b
on (b.artnr = a.artnr)
ARTNR | DATUM | MENGE | LIEFERANT1 | LIEFERANT1_AB_MENGE | LIEFERANT_1_EINKAUFSPREIS | LIEFERANT2 | LIEFERANT2_AB_MENGE | LIEFERANT2_EINKAUFSPREIS | 1 | 01-FEB-20 | 25 | L2 | 20 | .9 | L1 | 100 | .8 |
---|