Anmelden

View Full Version : SQL Problem/Frage



mwithake
22-06-05, 12:35
Hallo,

eine Frage an SQL-Experten:

Ich habe eine Datei in der cronologisch Preisänderungen gespeichert werden. In dieser Datei sind Artikel, Preis und Änderungsdatum enthalten. Ich habe nun unter SQL das Problem, den richtigen Preis zu einem bestimmten Datum zu ermitteln.

Beispiel:

Die Datei hat folgenden Inhalt:

Artikel Datum Preis
0815 01.01.2005 100€
0815 13.02.2005 90€
0815 24.03 2005 80€

Wenn ich nun den Preis des Artikel 0815 am 01.03.2005 ermitteln soll, würde ich das in RPG folgendermaßen machen:

settgt (0815:d'01.03.2005') datei;
readpe (0815) datei;

und würde dann 90€ erhalten.

Für SQL habe ich zwar auch ein Lösung gefunden, die aber nicht sehr performant ist:

SELECT preis
FROM datei
WHERE artikel=0815 AND datum=(SELECT MAX(datum) FROM datei AS tt WHERE tt.artikel=datei.artikel AND tt.datum<='01.03.2005')

Für eine einzelne Abfrage ist die Geschwindigkeit noch in Ordnung aber wenn ich den Wert eines ganzen Lagerbestandes zu einem bestimmten Zeitpunkt ermitteln will, dauert das sehr lange.

Hat hier jemand einen besseren Lösungsvorschlag?

Danke im voraus.
M.Withake

Fuerchau
22-06-05, 13:09
Leider ist das so bei SQL, dass ein Select normalerweise viele Sätze zurückgibt.
Nur durch eben deine Methode kannst du gezielt eine einzelne Information bekommen.
In RPG ist das eben so einfach wie du beschreibst.

Einen kleinen Trick gibt es aber schon:

select max(char(datum) || char(Preis)) from datei
where artikel=0815 and datum<='01.03.2005'

Damit erfolgt der Zugriff etwas schneller, du hast den Preis und das DAtum jedoch in einem Feld, dass du allerdings wieder trennen kannst:

with
xpreis as
(select max(char(datum) || char(Preis)) as mpreis from datei
where artikel=0815 and datum<='01.03.2005'
)
select date(substr(mpreis, 1, 10)) as datum, dec(substr(mpreis, 11, 11), 11, 2) as preis
from xpreis

Vorausgesetzt, das Preisfeld ist dec(11, 2).

BenderD
24-06-05, 18:37
Hallo,

das lässt sich eigentlich nur Datenbanktechnisch, oder funktional lösen:
- Datum gültig von und gültig bis abspeichern, dann kann man das performant packen
- SQL Function schreiben, die dann einen Cursor öffnet und den ersten Satz zurück liefert.

mfg

Dieter Bender


Hallo,

eine Frage an SQL-Experten:

Ich habe eine Datei in der cronologisch Preisänderungen gespeichert werden. In dieser Datei sind Artikel, Preis und Änderungsdatum enthalten. Ich habe nun unter SQL das Problem, den richtigen Preis zu einem bestimmten Datum zu ermitteln.

Beispiel:

Die Datei hat folgenden Inhalt:

Artikel Datum Preis
0815 01.01.2005 100?
0815 13.02.2005 90?
0815 24.03 2005 80?

Wenn ich nun den Preis des Artikel 0815 am 01.03.2005 ermitteln soll, würde ich das in RPG folgendermaßen machen:

settgt (0815:d'01.03.2005') datei;
readpe (0815) datei;

und würde dann 90? erhalten.

Für SQL habe ich zwar auch ein Lösung gefunden, die aber nicht sehr performant ist:

SELECT preis
FROM datei
WHERE artikel=0815 AND datum=(SELECT MAX(datum) FROM datei AS tt WHERE tt.artikel=datei.artikel AND tt.datum<='01.03.2005')

Für eine einzelne Abfrage ist die Geschwindigkeit noch in Ordnung aber wenn ich den Wert eines ganzen Lagerbestandes zu einem bestimmten Zeitpunkt ermitteln will, dauert das sehr lange.

Hat hier jemand einen besseren Lösungsvorschlag?

Danke im voraus.
M.Withake