PDA

View Full Version : SQL mit zwei Max Datum



camouflage
22-04-21, 10:02
Hallo Forum,

Ich möchte eine View mit dem aktuellsten Verkaufspreis und Einkaufspreis. Beide Preise sind in Tabellen mit einem gültig ab Datum gespeichert. Eine Verkaufspreisliste bring ich schon zustande, nur wenn sie kombiniert werden soll, da hakt es.

meine SQL-Definition:

with x as (select itemno, max(valdat) maxdat from mylib.salespric group by itemno
order by itemno)


select x.itemno as "Artikelnummer",
char(date(timestamp((a.valdat + 19000000) concat'000000')),eur) as "ab Datum",
currency as "Währung",
price as "Verkaufspreis"
from x join mylib.salespric a on x.itemno = a.itemno and MaxDat = a.valdat


Für einen kleinen Anschubser sag ich schon mal Danke.

dibe
22-04-21, 10:37
ungefär so?

with a as (select item, max(dat) as dat
from VKfile
group by item),
b as (select item, dat, price
from a, VKfile
where a.item=VKfile.item and a.dat=VKfile.dat),
c as (select item, max(dat) as dat
from EKfile
group by item),
d as (select item, dat, price
from a, EKfile
where a.item=EKfile.item and a.dat=EKfile.dat)
select item, b.price als VKP, d.price as EKP
from b, d
where b.item = d.item



Wenn ich Sie richtig verstanden habe.

in B und D steht je Item der letzte Wert. Nur wenn Preise im voraus erfasst werden sind noch Anpassungen nötig.

DiBe

camouflage
22-04-21, 10:54
Sieht gut aus, ich versuchs mal.
Danke

Fuerchau
22-04-21, 11:02
Wie bereits in einem anderem Thread mitgeteilt, lässt sich dies mittels Lateral sehr leicht lösen.
Meist hat man ja ein "Gültig Ab" oder "Gültig Bis".

Folglich gibts 2 Varianten:



select a.menge, b.preis, a.PreisDatum
from AuftragsPosition a
cross join lateral (
select Preis from PreisTabelle b
where a.Artikel = b.Artikel and a.Preisdatum >= b.GueltigAb
order by Artikel, GueltigAb asc
fetch first 1 rows only
) b

select a.menge, b.preis, a.PreisDatum
from AuftragsPosition a
cross join lateral (
select Preis from PreisTabelle b
where a.Artikel = b.Artikel and a.Preisdatum <= b.GueltigBis
order by Artikel, GueltigBis desc
fetch first 1 rows only
) b



Theoretisch könnte man auch 2 Cross-Joins zusammen verwenden und per coalesce(b1.Preis, b2.Preis) prüfen:
Wenn kein aktueller Preis (b1) dann nimm den letzten vorhandenen Preis (b2).