starmann
Goto Top

SQL max wert in WHERE Bedingung

Hi,

ich möchte alle Daten Sätze aus dem größten Jahr,
Wie bekomme ich den wert in die WHERE Bedingung?
SELECT 
    we.NAME,
    un.BILANZSUMME,
    un.JAHR
from UNTERNEHMENSDATEN 
    join WERTPAPIER we
    on un.WKN = we.WKN
WHERE un.JAHR = select max(jahr) from UNTERNEHMENSDATEN
order by  un.BILANZSUMME DESC;

Content-ID: 342266

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

Ausgedruckt am: 23.11.2024 um 11:11 Uhr

em-pie
em-pie 02.07.2017 um 22:22:47 Uhr
Goto Top
Moin,

versuche es mal anstelle der WHERE Clause mit der HAVING-Syntax

Die greift immer dann, wenn du ein Group by implementiert hast und auf dessen Ergbnis filtern möchtest

Gruß
em-pie
StarMann
StarMann 02.07.2017 um 22:30:14 Uhr
Goto Top
also so?
SELECT  
we.NAME, 
un.BILANZSUMME, 
un.JAHR 
from UNTERNEHMENSDATEN
    join WERTPAPIER we 
    on un.WKN = we.WKN 
GROUP BY un.JAHR
HAVING max(un.JAHR)
order by  un.BILANZSUMME DESC;

Fehler
ORA-00920: Ungültiger relationaler Operator
00920. 00000 - "invalid relational operator"
*Cause:
*Action:
Fehler in Zeile: 10 Spalte: 1
em-pie
em-pie 02.07.2017 um 22:55:58 Uhr
Goto Top
Hmm..
hatte deinen Post - zugegebener Maßen - wohl nur überflogen face-plain
vergiss den obigen Kram also!

Du brauchst noch ein Subselect auf deine gleiche Sicht, welches du JOINEN kannst/ solltest (wäre eine Variante):
Im Subselect müsstest du zunächst ein GROUP BY mit max(Jahr) erstellen. Diese Sicht JOINST du dann mit deiner obigen Tabelle und verwendest wieder die WHERE CLAUSE

Zu deiner Fehlermeldung:
Dann fehlt dir der Operator im Having:
Deine Jahreszahl wird mit nichts verglichen...
Sagt dir aber auch der Fehlercode, mit dem du von dem Hersteller "begrüßt" wurdest.
http://www.dba-oracle.com/t_ora_00920_invalid_relational_operator.htm


Weiterer Tipp:
Schreibe IMMER zu Beginn, um welche DB es sich handelt....
Biber
Biber 02.07.2017 um 23:20:22 Uhr
Goto Top
Moin StarMann,

dein Statement ist fast ok, aber das Subselect muss in Klammern gesetzt werden.
Und der Alias "un" muss auch bei Unternehmensdaten angegeben werden.
SELECT 
    we.NAME,
    un.BILANZSUMME,
    un.JAHR
from UNTERNEHMENSDATEN un
    join WERTPAPIER we
    on un.WKN = we.WKN
WHERE un.JAHR = (select max(jahr) from UNTERNEHMENSDATEN)
order by  un.BILANZSUMME DESC;

Vorausgesetzt, du hast die Aufgabe richtig interpretiert... nicht dass jeweils das maximal vorhandene jahr je Wertpapier gefordert war.
So jedenfalls werden nur die Wertpapiere angezeigt, die im max(jahr) aller Wertpapiere in der Tabelle vorhanden waren.

Grüße
Biber
StarMann
StarMann 03.07.2017 aktualisiert um 00:21:36 Uhr
Goto Top
@em-pie
Ok aber in SQL kann ich doch nicht schachteln oder variablen erzeugen.

@Biber
das habe ich auch schon versucht.
SELECT  
    we.NAME, 
    un.BILANZSUMME, 
    un.JAHR 
from UNTERNEHMENSDATEN un 
    join WERTPAPIER we 
    on un.WKN = we.WKN 
WHERE un.JAHR = (select max(jahr) from UNTERNEHMENSDATEN) 
order by  un.BILANZSUMME DESC;

ORA-00911: Ungültiges Zeichen
00911. 00000 - "invalid character"
*Cause: identifiers may not start with any ASCII character other than
letters and numbers. $#_ are also allowed after the first
character. Identifiers enclosed by doublequotes may contain
any character other than a doublequote. Alternative quotes
(q'#...#') cannot use spaces, tabs, or carriage returns as
delimiters. For all other contexts, consult the SQL Language
Reference Manual.
*Action:
Fehler in Zeile: 1 Spalte: 8
Biber
Lösung Biber 03.07.2017 um 05:16:38 Uhr
Goto Top
Moin StarMann,

Versuche mal bitte statt
WHERE ...= ( SELECT...)

Alternativ ein

WHERE ... IN (SELECT...)

Grüße
Biber
StarMann
StarMann 03.07.2017 aktualisiert um 08:42:41 Uhr
Goto Top
@Biber
Nein leider auch nicht

SELECT   
    we.NAME,  
    un.BILANZSUMME,  
    un.JAHR  
from UNTERNEHMENSDATEN un  
    join WERTPAPIER we  
    on un.WKN = we.WKN  
WHERE un.JAHR = in(SELECT MAX(jahr) FROM UNTERNEHMENSDATEN)  
order by  un.BILANZSUMME DESC;
Fehler
ORA-00936: Ausdruck fehlt
00936. 00000 - "missing expression"
*Cause:
*Action:
Fehler in Zeile: 8 Spalte: 17


Oh Sorry Funktionier doch

SELECT   
    we.NAME,  
    un.BILANZSUMME,  
    un.JAHR  
from UNTERNEHMENSDATEN un  
    join WERTPAPIER we  
    on un.WKN = we.WKN  
WHERE un.JAHR in(SELECT MAX(jahr) FROM UNTERNEHMENSDATEN)  
order by  un.BILANZSUMME DESC;