# SQL-Abfrage - Benötige Hilfe!!



## the_notwist (7. Juni 2009)

Hallo zusammen,

ich muss für mein Studium eine SQL-Abfrage schreiben, an der ich mittlerweile am verzweifeln bin!

Ich versuche mal den Sachverhalt so verständlich wie möglich darzustellen:

In der Grafik im Anhang kann man sehen, dass es u.a. die Tabellen LAGERBESTAND und TEILE gibt.




Die Aufgabe lautet lapidar: " In welchem Lager werden die meisten Artikel (Typ = 'Artikel') gelagert? Geben Sie die LANR aus!"

Klingt einfach, ist aber schwerer, da ja nur die LANR ausgegeben werden soll. Somit fällt eine Gruppenfunktion in der SELECT-Klausel weg. Ich habe schon versucht in der WHERE-Klausel mit MAX(SUM(Lagerbestand.BESTAND) zu schachteln, aber das gibt kein Ergebnis. Auch mit HAVING hatte ich keinen Erfolg.

Folgend noch meine bisherigen Ansätze:

1.
SELECT Lagerbestand.LANR
FROM Lagerbestand INNER JOIN Teile ON Lagerbestand.TNR=Teile.TNR
WHERE Teile.TYP = 'Artikel'
GROUP BY Lagerbestand.LANR
HAVING SUM(Lagerbestand.BESTAND) > 9000

--> Das liefert die richtige Trefferzeile aber ist mit > 9000 künstlich eingeschränkt. Die Abfrage muss allgemeingültig sein.


2.
SELECT Lagerbestand.LANR, SUM(Lagerbestand.LANR)
FROM Lagerbestand INNER JOIN Teile ON Lagerbestand.TNR=Teile.TNR
WHERE Lagerbestand.BESTAND = (SELECT MAX(SUM(Lagerbestand.LANR)) FROM Lagerbestand GROUP BY Lagerbestand.LANR)
GROUP BY Lagerbestand.LANR

--> Hier habe ich es mit einer Unterabfrage versucht, komme aber auch nicht weiter.

Wäre echt toll, wenn jemandem dazu was einfallen würde.

Wenn noch Infos fehlen, kann ich diese gerne nachreichen.


Gruß
Dominik


----------



## hammet (8. Juni 2009)

```
SELECT Lagerbestand.LANR
FROM Lagerbestand INNER JOIN Teile ON Lagerbestand.TNR=Teile.TNR
WHERE Teile.TYP = 'Artikel'
ORDER BY MAX(SUM(Lagerbestand.BESTAND)) DESC
LIMIT 1
```

Weiß nicht genau ob es funktioniert, aber ein versuch ist es wert


----------



## the_notwist (9. Juni 2009)

Hallo hammet,

danke für deine Antwort, aber so geht es leider nicht (falsche Syntax).

Ich habe jetzt folgenden Ansatz:


```
SELECT l.LANR
FROM TEILE t INNER JOIN LAGERBESTAND l ON l.TNR = t.TNR
WHERE t.TYP = 'Artikel' AND l.BESTAND = (SELECT MAX(l2.BESTAND)
                                         FROM TEILE t2 INNER JOIN LAGERBESTAND l2 ON             
                                         l2.TNR = t2.TNR WHERE t2.TYP = 'Artikel')
```

Nur wird dann der höchste Einzelbestand eines Artikels in allen Lägern geprüft.

Mann müsste aber erst die Bestandssumme von jedem Lager bilden und dann den höchsten Bestand (MAX) auswählen.
Ich vermute auch dass man MAX(SUM(Bestand)) schachteln muss, aber ich bekomme die Syntax einfach nicht hin?

Kann vielleicht noch jemand helfen?


----------



## kuddeldaddeldu (9. Juni 2009)

Hi,

nimm in hammets Abfrage das MAX raus und sortiere also nach SUM(Bestand). Außerdem hat er die Gruppierung vergessen. Den richtigen Datensatz bekommst Du dann ja gerade durch diese Sortierung in Verbindung mit LIMIT.

LG


----------



## the_notwist (9. Juni 2009)

Hallo kuddeldaddeldu,

meinst du so ähnlich wie hier?


```
SELECT Lagerbestand.LANR
FROM Lagerbestand INNER JOIN Teile ON Lagerbestand.TNR=Teile.TNR
WHERE Teile.TYP = 'Artikel'
GROUP BY Lagerbestand.LANR
LIMIT 1
ORDER BY SUM(Lagerbestand.BESTAND) DESC
```

Den LIMIT-Befehl kenne ich gar nicht. Bekomme auch die Meldung:
"ORA-00933: SQL-Befehl wurde nicht korrekt beendet"

Hinweis: Es soll ja als Ergebnis nur eine Lagernummer (die mit den meisten Artikeln) ausgegeben werden.
Deswegen wäre ein ORDER BY überflüssig, oder?

Danke für eine Antwort im Voraus!


----------



## kuddeldaddeldu (9. Juni 2009)

Hi,

die LIMIT-Klausel müsste am Ende stehen, allerdings wird Dir das auch nicht helfen, weil:



the_notwist hat gesagt.:


> Den LIMIT-Befehl kenne ich gar nicht. Bekomme auch die Meldung:
> "ORA-00933: SQL-Befehl wurde nicht korrekt beendet"



in *Oracle* gibt es soviel ich weiß ja auch keine LIMIT-Klausel. Du solltest das nächste Mal auch angeben, welches DBMS Du benutzt. Die meisten hier gehen ansonsten wohl von MySQL aus.



the_notwist hat gesagt.:


> Hinweis: Es soll ja als Ergebnis nur eine Lagernummer (die mit den meisten Artikeln) ausgegeben werden.
> Deswegen wäre ein ORDER BY überflüssig, oder?



Genau das hätte ja die LIMIT-Klausel bewirken sollen, von den sortierten Datensätzen nur den ersten (und damit höchsten Lagerbestand) liefern.

LG


----------

