badfsaadkl
Goto Top

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.

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

Content-ID: 226663

Url: https://administrator.de/contentid/226663

Ausgedruckt am: 22.11.2024 um 13:11 Uhr

colinardo
colinardo 14.01.2014 aktualisiert um 20:44:43 Uhr
Goto Top
Hi,
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
LIMIT 1
Grüße Uwe
BadFsaadKl
BadFsaadKl 14.01.2014 um 20:36:11 Uhr
Goto Top
Hi Uwe,

bekomme hier immer nur den 15.11.06 als Wert raus.
selbst wenn ich die Sortierung DESC durch ASC tausche.

Grüße Michel
colinardo
colinardo 14.01.2014 um 20:45:41 Uhr
Goto Top
hab's grad nochmal geändert, kann's gerade nicht testen ...
BadFsaadKl
BadFsaadKl 14.01.2014 um 20:45:46 Uhr
Goto Top
Ich habe auch das gleiche wenn ich ich mir nur den größten Wert von Durchschnittswerten anzeigen lassen möchte:

SELECT
  a.herst AS "HERST",  
  AVG(a.f_std) AS "MMFST"  
FROM
  osq01_flugzeug a
GROUP BY a.herst
ORDER BY MMFST DESC
Ergebnis:
Douglas        	8447
Boeing         	6225
Airbus         	3239,333333333333333333333333333333333333

Und wenn ich das jetzt mit Rownum mache bekomme ich was völlig anderes:
SELECT
  a.herst AS "HERST",  
  AVG(a.f_std) AS "MMFST"  
FROM
  osq01_flugzeug a
WHERE ROWNUM = 1
GROUP BY a.herst
ORDER BY MMFST DESC
Ergebnis:
Boeing         	4567
BadFsaadKl
BadFsaadKl 14.01.2014 um 20:47:52 Uhr
Goto Top
Mit dem Limit bekomme ich gleich nen ORA Fehler:
ORA-00933: SQL command not properly ended
00933. 00000 -  "SQL command not properly ended"  
*Cause:    
*Action:
Fehler in Zeile: 16 Spalte: 1
colinardo
colinardo 14.01.2014 um 20:52:20 Uhr
Goto Top
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 face-wink
colinardo
Lösung colinardo 14.01.2014 aktualisiert um 21:51:15 Uhr
Goto Top
So müsste es für Oracle gehen
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;
BadFsaadKl
BadFsaadKl 14.01.2014 um 21:50:58 Uhr
Goto Top
Supi.
Funktioniert.

Danke Uwe

Gruß Michel
Biber
Lösung Biber 15.01.2014, aktualisiert am 29.04.2014 um 19:36:07 Uhr
Goto Top
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.

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;
Ergebnis ist ein Datum definitiv ausserhalb des Bereichs 10.Nov 2006 - 20.Nov 2006..
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;
Ergebnis.
AB_DATUM | F_BEZ  | HERST  | TYP  | SER_NR   
---------+--------+--------+------+----------
17.11.06 | LH-421 | Boeing | B777 | xv23-0889


Grüße
Biber