SQL. Datensatz mit der größten Differenz?
Grüß Gott,
nun bin ich schon seit knapp einer halben Stunde einer einer Aufgabe:
Die dazugehörigen Datenbankdaten
Ich bekomme es nicht hin. Habe diverse Zeilen Code ausprobiert, aber nichts funktioniert.
Was bis jetzt am nähsten kam:
SELECT Bezeichnung, MAX(V_Preis - E_Preis) AS Gewinnspanne
FROM produkt
Das gibt mir aber nur das hier aus:
- Bezeichnung = Stuhl
- Gewinnspanne = 550
Die Gewinnspanne ist richtig, aber die Bezeichnung nicht. Ich weiß das da noch eine WHERE Bedingung hinzugefügt werden muss. Ich weiß nur nicht wie die lauten muss.
Freundliche Grüße
T.
3 Antworten
SELECT Bezeichnung, (V_Preis - E_Preis) AS Gewinnspanne
FROM produkt
WHERE Gewinnspanne =
(select MAX(V_Preis - E_Preis) from produkt);
Ist im Prinzip dasselbe wie order by ... limit 1, funktioniert aber auch, wenn es mehrere Produkte mit gleicher Gewinnspanne gibt.
Bei deiner Lösung kommt deshalb Unsinn heraus, weil du eine Aggegatsfunktion (hier MAX) benutzt und im SELECT mehr als das Gruppierkriterium (hier gar keins, also nur eine große Gruppe) hast. Dann kommt einfach der erstbeste Bezeichner aus der Gruppe. Strenge SQL-Dialekte lassen das erst gar nicht zu. In MySQL kann man das einstellen.
Da kommt dann die Fehlermeldung:
In aggregated query without GROUP BY, expression #1 of SELECT list contains nonaggregated column 'sql_select_db.cia.Name'; this is incompatible with sql_mode=only_full_group_by
Bei deiner Lösung kommt der gleiche Fehler raus den ich auch ein paar mal hatte. Und zwar das er "Gewinnspanne" (bei WHERE) nicht kennt.
Korrektur:
Leider kannst du Gewinnspanne in der where-clause nicht verwenden, also muss es heißen
SELECT Bezeichnung, (V_Preis - E_Preis) AS Gewinnspanne
FROM produkt
WHERE V_Preis - E_Preis =
(select MAX(V_Preis - E_Preis) from produkt);
Nein, du müsstest die Ergebnismenge sortieren.
SELECT Bezeichnung, MAX(V_Preis - E_Preis) AS Gewinnspanne
FROM produkt
ORDER BY MAX(V_Preis - E_Preis) DESC
LIMIT 1
Alternativ wäre auch ein Subselect ggfs. sinnvoll zu verwenden.
SELECT Bezeichnung, (V_Preis - E_Preis) AS Gewinnspanne
FROM produkt
ORDER BY Gewinnspanne DESC
LIMIT 1
Zweimal ohne MAX, das sollte es eigentlich tun.
Habe ich hier ausprobiert. Schönes Tutorial zum Lernen.
Na du willst den Eintrag wo die Gewinnspanne gleich der maximalen Gewinnspanne ist.
Also imgrunde: where (vpreis - Preis) = max(vpreis-epreis)
Weiss nicht ob das in sql so exakt geht, da müsste ich auch erst rumprobieren. Aber dann in Absatz 1 willste ja wissen.
Hmm.. es kommt aber trotzdem noch 'Stuhl' als Bezeichnung raus