Größter Datumswert in SQL Abfrage
Moin zusammen,
ich glaub ich hab nen kleinen Hänger.
Habe eine kleine SQL (Oracle) Abfrage, welche mir 2 Ergebnisse zurück gibt.
Ergebnis:
Ich möchte als Ausgabe jedoch nur den Eintrag, mit dem Höchsten/Größten Datum. Sprich die Werte vom 17.11.06
Wenn ich im SELECT Bereich das Datum mit MAX auswähle, erhalte ich folgenden Fehler:
Ich steh momentan Total auf dem Schlauch, was ich hier Gruppieren muss, damit das funktioniert.
Habt Ihr ne Idee wo ich gerade hänge ?
Danke
Gruß BadFsaadKl
ich glaub ich hab nen kleinen Hänger.
Habe eine kleine SQL (Oracle) Abfrage, welche mir 2 Ergebnisse zurück gibt.
SELECT
a.ab_datum,
a.f_bez,
a.herst,
a.typ,
a.ser_nr
FROM
osq01_abflug a,
osq01_flug b
WHERE
a.f_bez = b.f_bez AND
b.s_ort = 'Luxemburg' AND
b.z_ort = 'Ankara' AND
a.ab_datum BETWEEN '10.11.2006' AND '20.11.2006'
Ergebnis:
15.11.06 LH-421 Boeing B777 xv56-3142
17.11.06 LH-421 Boeing B777 xv23-0889
Ich möchte als Ausgabe jedoch nur den Eintrag, mit dem Höchsten/Größten Datum. Sprich die Werte vom 17.11.06
Wenn ich im SELECT Bereich das Datum mit MAX auswähle, erhalte ich folgenden Fehler:
SELECT
MAX(a.ab_datum),
a.f_bez,
a.herst,
a.typ,
a.ser_nr
FROM
osq01_abflug a,
osq01_flug b
WHERE
a.f_bez = b.f_bez AND
b.s_ort = 'Luxemburg' AND
b.z_ort = 'Ankara' AND
a.ab_datum BETWEEN '10.11.2006' AND '20.11.2006'
ORA-00937: not a single-group group function
00937. 00000 - "not a single-group group function"
*Cause:
*Action:
Fehler in Zeile: 3 Spalte: 3
Ich steh momentan Total auf dem Schlauch, was ich hier Gruppieren muss, damit das funktioniert.
Habt Ihr ne Idee wo ich gerade hänge ?
Danke
Gruß BadFsaadKl
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 226663
Url: https://administrator.de/contentid/226663
Ausgedruckt am: 22.11.2024 um 13:11 Uhr
9 Kommentare
Neuester Kommentar
oh nö das ist ja Oracle , dann geht das nicht, wie du es dort machst:
http://stackoverflow.com/questions/11390585/maxdate-sql-oracle
Sorry bin grad auf dem Smartphone
http://stackoverflow.com/questions/11390585/maxdate-sql-oracle
Sorry bin grad auf dem Smartphone
Moin BadFsaadKl und colinardo,
da muss ich Einspruch erheben - diese Abfrage liefert bei den oben angegebenen Daten das richtige Ergebnis - aber nicht bei anderen.
Da das "Abflugdatum" in der Tabelle osq01_abflug nur ein Stringwert ist (und kein Datum), wird hier auch nur ein Stringvergleich gemacht.
Bedeutet: bei der Prüfung "...a.ab_datum BETWEEN '10.11.2006' AND '20.11.2006' " werde alle Strings gefunden, die zwischen "10*" und "20*" sind und davon der "höchste" genommen.
Das muss aber nicht mal ein Datumswert, geschweige denn ein Datum aus dem Jahr 2006 sein,
Beispiel: Wenn in den gefundenen Daten auch noch ein Flug "LH-421" von Luxemburg nach Ankara wäre z.B vom Datum 18.11.2013 (also eigentlich ausserhalb des vermeinlich abgefragten Zeitraums "...a.ab_datum BETWEEN '10.11.2006' AND '20.11.2006' " , dann wird wegen des Stringsvergleichs mit colinardos Abfrage dieser gefunden.
Ergebnis ist ein Datum definitiv ausserhalb des Bereichs 10.Nov 2006 - 20.Nov 2006..
Besser wäre es mit einer Prüfung auf Datumswerte:
Ergebnis.
Grüße
Biber
da muss ich Einspruch erheben - diese Abfrage liefert bei den oben angegebenen Daten das richtige Ergebnis - aber nicht bei anderen.
Da das "Abflugdatum" in der Tabelle osq01_abflug nur ein Stringwert ist (und kein Datum), wird hier auch nur ein Stringvergleich gemacht.
Bedeutet: bei der Prüfung "...a.ab_datum BETWEEN '10.11.2006' AND '20.11.2006' " werde alle Strings gefunden, die zwischen "10*" und "20*" sind und davon der "höchste" genommen.
Das muss aber nicht mal ein Datumswert, geschweige denn ein Datum aus dem Jahr 2006 sein,
Beispiel: Wenn in den gefundenen Daten auch noch ein Flug "LH-421" von Luxemburg nach Ankara wäre z.B vom Datum 18.11.2013 (also eigentlich ausserhalb des vermeinlich abgefragten Zeitraums "...a.ab_datum BETWEEN '10.11.2006' AND '20.11.2006' " , dann wird wegen des Stringsvergleichs mit colinardos Abfrage dieser gefunden.
with osq01_abflug( ab_datum, f_bez, herst, typ, ser_nr) as
( select '17.11.06', 'LH-421', 'Boeing' , 'B777', 'xv23-0889' from dual
union all select '15.11.06', 'LH-421', 'Boeing', 'B777', 'xv56-3142' from dual
union all select '18.11.13', 'LH-421', 'Boeing', 'B777', 'xv99-0815' from dual
)
, osq01_flug (f_bez, s_ort, z_ort) as
( select 'LH-421', 'Luxemburg', 'Ankara' from dual )
SELECT * FROM (
SELECT
a.ab_datum,
a.f_bez,
a.herst,
a.typ,
a.ser_nr
FROM
osq01_abflug a,
osq01_flug b
WHERE
a.f_bez = b.f_bez AND
b.s_ort = 'Luxemburg' AND
b.z_ort = 'Ankara' AND
a.ab_datum BETWEEN '10.11.2006' AND '20.11.2006'
ORDER BY a.ab_datum DESC)
WHERE ROWNUM=1;
AB_DATUM | F_BEZ | HERST | TYP | SER_NR
---------+--------+--------+------+----------
18.11.13 | LH-421 | Boeing | B777 | xv99-0815
Besser wäre es mit einer Prüfung auf Datumswerte:
with osq01_abflug( ab_datum, f_bez, herst, typ, ser_nr) as
( select '17.11.06', 'LH-421', 'Boeing' , 'B777', 'xv23-0889' from dual
union all select '15.11.06', 'LH-421', 'Boeing', 'B777', 'xv56-3142' from dual
union all select '18.11.13', 'LH-421', 'Boeing', 'B777', 'xv99-0815' from dual
)
, osq01_flug (f_bez, s_ort, z_ort) as
( select 'LH-421', 'Luxemburg', 'Ankara' from dual )
SELECT * FROM (
SELECT
a.ab_datum,
a.f_bez,
a.herst,
a.typ,
a.ser_nr
FROM
osq01_abflug a,
osq01_flug b
WHERE
a.f_bez = b.f_bez AND
b.s_ort = 'Luxemburg' AND
b.z_ort = 'Ankara' AND
To_date(a.ab_datum, 'dd.mm.yy') BETWEEN To_date('10.11.2006', 'dd.mm.yyyy') AND to_date('20.11.2006','dd.mm.yyyy')
ORDER BY To_date(a.ab_datum, 'dd.mm.yy') DESC)
WHERE ROWNUM=1;
AB_DATUM | F_BEZ | HERST | TYP | SER_NR
---------+--------+--------+------+----------
17.11.06 | LH-421 | Boeing | B777 | xv23-0889
Grüße
Biber