Wie lautet diese MySQL-Abfrage in Oracle-SQL?

winfire

Neuer Benutzer
Beiträge
1
Hi,
ich versuch diese MySQL-Abfrage unter Oracle-SQL zum Laufen zu bekommen.
Probleme machen das "ORDER BY" in der Sub-Query (nicht erlaubt) und "LIMIT 1" (ROWNUM=1?)
Es geht darum aus der Preisliste jenen Preis zu ermitteln, dessen Datum am nächsten am entsprechenen Monatsletzten liegt. In MySQL sortiere ich die Preise einfach nach Datum absteigend und nehme die erste Zeile. Wie geht das in Oracle?
siehe auch SQL-Fiddle SQL Fiddle | A tool for easy online testing and sharing of database problems and their solutions.
Code:
SELECT
  A.artikel,
  K.monat,
  (
  SELECT
  P.preis
  FROM
  Preisliste AS P
  WHERE
  P.artikel = A.artikel
  AND
  P.datum <= K.monatsletzter
  ORDER BY
  P.datum DESC
  LIMIT 1
  ) AS Monatspreis
FROM
  Artikel AS A,
  Kalender AS K
ORDER BY artikel,k.jahr,k.monat
 
Werbung:
Lassen wir mal die Dinge wie Artikelname weg. Letztendlich willst Du von dieser Tabelle:

Code:
test=*# create table preisliste(id int primary key, artikel int, datum date, preis int);
CREATE TABLE

für jeden Artikel (distinct on artikel) je Monat (date_trunc...) für den höchsten Wert Datumswert des Monats den Preis zu erfragen.

Code:
select distinct on (artikel, date_trunc('month',datum)) artikel, date_trunc('month',datum), preis from preisliste order by artikel, date_trunc('month',datum), datum desc;

Ich habe es jetzt NICHT mit Daten getestet, nur mit einer leeren Tabelle - und mit PostgreSQL. Ich bin mir nicht sicher, ob Oracle die coole distinct on (...) - Geschichte von PostgreSQL unterstützt.

Falls nein, mußt es halt umschreiben. Erst einmal Artikel und höchstes Datum je Monat ermitteln und das joinen. Eher einfach. Schaffst Du auch.
 
Zurück
Oben