Kleine frage zu having,group by...
Hallo,
habe folgende tabelle 'einkauf'
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
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:
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
Wäre froh, wenn mir kurz jemand auf die Sprünge helfen könnte.
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
Wäre froh, wenn mir kurz jemand auf die Sprünge helfen könnte.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 134354
Url: https://administrator.de/contentid/134354
Ausgedruckt am: 16.11.2024 um 15:11 Uhr
3 Kommentare
Neuester Kommentar
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.
...würde liefern:
Grüße
Biber
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:
artnr | lieferant | preis |
111 | B | 9 |
222 | A | 7 |
Grüße
Biber
Wird bei GROUP nicht immer der zuerst gefundene Wert genommen ? - dann sollte doch auch:
... 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
SELECT tmp.*
FROM (
SELECT artnr, lieferant, preis
FROM einkauf
ORDER BY preis
/* WHERE artnr = @artnr */
) AS tmp
GROUP BY tmp.lieferant, tmp.artnr
btw. Hat die Tabelle keine ID ?
edit: SQL überarbeitet