alterverwalter
Goto Top

Kleine frage zu having,group by...

Hallo,

habe folgende tabelle 'einkauf'

artnr lieferant preis
111 A 10
111 B 9
111 C 12
222 A 7
222 C 12

ich will ganz einfach als Ergebnis eine Liste mit allen artikel haben mit dem geringsten einkaufspreis und dem enstprechenden günstigsten preis

Ganz simpel habe ich es versucht mit

select artnr,lieferant,min(preis) from einkauf group by artnr


Aber dann wird nicht der entsprechende Lieferant mit dem günstigsten Preis angezeigt, sondern willkürlich irgendein Lieferant , der diesen Artikel im Programm hat.

Dann habe ich es mit having versucht:

select artnr,lieferant,min(preis) from einkauf group by artnr having min(preis)

Liefert das gleiche Ergebnis wie oben.


Irgendwie stehe ich hier total auf dem Schlauch. Ist doch im Prinzip eine simple Sache, oder? Kann doch fast nicht sein,dass ich mich damit den ganzen Morgen beschäftigen muss face-sad
Wäre froh, wenn mir kurz jemand auf die Sprünge helfen könnte.

Content-ID: 134354

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

Ausgedruckt am: 16.11.2024 um 15:11 Uhr

Biber
Biber 26.01.2010 um 10:25:51 Uhr
Goto Top
Moin alterVerwalter,

eine Ermittlung des kleinsten Preises mit MIN(preis) verbunden mit einem "HAVING Min(preis)" ist nicht zielführend.

Bei GROUP BY-Abfragen werden Aggregatfunktionen wie Min/), Max(), Sum(), Avg()... verwendet, richtig.
Aber: HAVING "filtert" den Resultset einer kumulierten GROUP BY-Abfrage nur auf die Felder, die auch in der Feldliste erwähnt sind.
Und da kannst du den Lieferanten noch nicht dabeihaben.

Versuch es mit einem Subselect.

SELECT einkauf.artnr,einkauf.lieferant, einkauf.preis 
FROM einkauf, (SELECT artnr, min(preis) as minpreis FROM Einkauf GROUP BY artnr) billichKauf
WHERE einkauf.ARTNR=billichkauf.artnr
AND einkauf.preis=billichkauf.minpreis

...würde liefern:

artnrlieferantpreis
111B 9
222A7


Grüße
Biber
nxclass
nxclass 26.01.2010 um 10:56:08 Uhr
Goto Top
Wird bei GROUP nicht immer der zuerst gefundene Wert genommen ? - dann sollte doch auch:
SELECT tmp.*
FROM (
    SELECT artnr, lieferant, preis
    FROM einkauf
    ORDER BY preis
   /*  WHERE artnr = @artnr */
    ) AS tmp
GROUP BY tmp.lieferant, tmp.artnr
... funktionieren. Mit dem Vorteil das nicht über die 'preis' Spalte gesucht werden muss. (bzw. ein Index generiert werden muss)

btw. Hat die Tabelle keine ID ?

edit: SQL überarbeitet
alterVerwalter
alterVerwalter 26.01.2010 um 11:48:17 Uhr
Goto Top
hallo,

danke biber, deine lösung hat genau das gebracht was ich gesucht habe!
Auf den trichter, dass ich den subquery auch in from einbringen kann, bin ich nicht gekommen, hatte es in der where klausel versucht, aber da bin ich nicht weiter gekommen und habe es wieder verworfen.

@nxclass: diese tabelle war natürlich nur sehr sehr stark vereinfacht.
und so ganz versteh ich auch dein lösungsansatz nicht, und vor allem warum "group by tmp.lieferant"?
wenn ich das so verwendete bekomm ich doch nur eine tabelle mit nur einer zeile pro lieferant mit willkürlicher ean und preis?!?

ist das wirklich so "eleganter"?


Aber ich denke mal, dass ich mit Biber´s Lösung auch zum Ziel komme!?!