Zum Inhalt springen

[SQL] Hilfe benötigt bei (trivialem?) SQL?


Flori

Empfohlene Beiträge

Hallo zusammen,

habe hier eine an sich sehr überschaubare Tabelle, die ein Lager für Artikel darstellt:

Tabelle "Lager" mit den Spalten "Artikelnr | Lagerort | Menge"

Das was als SQL-Anfrage an sich gestellt werden soll, ist recht nachvollziehbar, allerdings komme ich immer zur Rückgabe von mehr Zeilen als notwendig (die gesuchten sind immerhin dabei ;) ).

Und nun wollte ich mal fragen, ob jemand weiß, ob man nicht nur auch auf genau die eine zurückgebene Zeile kommen kann, die man am Ende benötigt?

Folgende Anfragen an die Tabelle:

a) Welcher Lagerort lagert am wenigsten Artikel mit der Artikelnr = 123 ?

B) Welche Artikelnr gibt es an mehr als einem Lagerort?

Weiß jemand, ob ich diese Anfragen jeweils mit einem SQL gelöst bekommen kann und wenn ja wie die Statements für a) und B) dann aussehen würden?

Vielleicht isses ja einfach nur trivial und ich hab mich einfach in irgendwas verrannt was die Sache nur unnötig kompliziert und mich den Wald vor lauter Bäumen nciht mehr sehen läßt. :-/

Vielen Dank für Eure Hilfe im Voraus!!!

Grüsse

Flori

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das wollte mir doch jetzt keine Ruhe lassen. ;)

Nach etwas Recherche in der MySQL-Doku und schlichtes rumprobieren hab ich es so wie ich es mir vorstelle.

Für alle die, die mal vor ähnlichen Problemen stehen, hier einfach mal die Statements, die die Anfragen in a) und B) auflösen:

für Anfrage a) :


SELECT lagerort

FROM lager

WHERE artikelnr = 123

AND menge = (SELECT MIN(menge) FROM lager WHERE artikelnr = 1)

Hierbei half folgende Seite aus der MySQL-Doku: "3.6.4. Die Zeilen, die das gruppenweise Maximum eines bestimmten Felds enthalten" -> Link Für Anfrage B) hab ich folgende Lösung:

SELECT artikelnr, COUNT(lagerort) AS cnt

FROM lager

GROUP BY artikelnr

HAVING cnt >1

Auf das HAVING war ich einfach anfangs nicht gekommen. :(

Geholfen hat mir hier folgendes aus der MySQL-Doku: "A.5.4. Probleme mit alias" -> Link

So, das soll nun aber auch für heute reichen. :)

Danke an diejenigen, die sich im Laufe des Tage mit meiner Frage beschäftigt hätten, wenn ich nicht doch selbst auf die Antwort gekommen wäre. ;)

/Flori

Link zu diesem Kommentar
Auf anderen Seiten teilen

ich würde sagen A) ist falsch.

Frage: Welcher Lagerort lagert am wenigsten Artikel mit der Artikelnr = 123 ?

Antwort:

-Suche alle Lager und Mengen von der Artikelnr. 123 auf und gib mir die kleinste Menge.


SELECT lagerort, MIN(Menge)

FROM lager

WHERE Artiekelnr = 123

GROUP BY menge

oder habe ich einen denkfehler ?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

also ich habe ja auch ne lange Zeit rumprobiert und ich bin inzwischen sehr sicher, daß es genau das ist was gefragt wurde.


SELECT lagerort

FROM lager

WHERE artikelnr = 123

AND menge = (SELECT MIN(menge) FROM lager WHERE artikelnr = 123)

In meinem Unterselect such ich mir erstmal heraus welches die minimale Menge von Artikel 123 ist. Dann nehme ich diese "menge" und suche nach dem "lagerort", der genau diese menge hat. Um zu vermeiden, daß andere Artikel mit gleicher Menge berücksichtigt werden, ist die artikelnr = 123 nochmal als Bedingung gegeben. So funzt es. :)

SELECT lagerort, MIN(Menge)

FROM lager

WHERE Artiekelnr = 123

GROUP BY menge

Du hingegen gruppierst nach der Menge, so daß Du alle MINs für verschiedene Lager bekommst. D.h. du bekommst einen MIN-Wert für jedes Lager welches den Artikel 123 bevorratet.

Aber wie gesagt, is auf den ersten Versuch hin auch nicht so leicht, da durchzusteigen.

Ich hab in den nächsten Tagen noch ein paar weitere Statements, für die ich vermutlich hier auch noch um Rat fragen werde...um schon mal den nächsten Beitrag anzukündigen. ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Antwort:

-Suche alle Lager und Mengen von der Artikelnr. 123 auf und gib mir die kleinste Menge.


SELECT lagerort, MIN(Menge)

FROM lager

WHERE Artiekelnr = 123

GROUP BY menge

oder habe ich einen denkfehler ?

Ja. MIN ist eine Aggregatfunktion und positioniert den Cursor nicht.

SELECT lagerort FROM lager WHERE menge = MIN(menge)

könnte gehen, ohne das jetzt probiert zu haben.

Link zu diesem Kommentar
Auf anderen Seiten teilen

SELECT lagerort FROM lager WHERE menge = MIN(menge)

Habs gerade einfach mal noch probiert und folgende (Fehler-)Meldung unter MySQL erhalten:

"#1111 - Invalid use of group function"

MIN() gehört in die Gruppe der "Funktionen zur Benutzung in GROUP BY-Klauseln" (Kap. 12.11.1. in MySQL-Doku, Vers.5.1)

Viele Grüsse

Flori

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...