SQL. Datensatz mit der größten Differenz?

3 Antworten

Vom Fragesteller als hilfreich ausgezeichnet
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

ColdertronHD 
Fragesteller
 29.02.2020, 21:20

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.

0
Schachpapa  29.02.2020, 21:21

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);
1
ColdertronHD 
Fragesteller
 29.02.2020, 21:23

Super Dankeschön jetzt funktioniert es :D

0

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.

Woher ich das weiß:Berufserfahrung
Schachpapa  29.02.2020, 21:08

Lass das MAX weg, das wird schon durch order by erledigt

0
ColdertronHD 
Fragesteller
 29.02.2020, 21:16

Hmm.. es kommt aber trotzdem noch 'Stuhl' als Bezeichnung raus

0
Schachpapa  29.02.2020, 21:36
@ColdertronHD
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.

0

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.