2017-03-22 1 views
1

Ich dachte, dies wäre von allgemeinem Interesse für die Gruppe, weil es eine tatsächliche Job-Interview SQL-Frage ist, die ich falsch verstanden habe. Ich denke, ich war nahe, aber kann jemand die richtige Antwort geben?SQL-Verhältnis von Wert zu max Spaltenwert nach Gruppe

Brand | Model | Price 
Braun | KF7150 | 98 
Braun | KF7000 | 70 
Braun | KF400 | 55 
Krups | KM730 | 67 
Krups | KM4689 | 130 
Krups | EC311 | 50 

Für die obige Tabelle (Kaffee), den Code zur Verfügung stellen, die Marke anzeigt, Modell, Preis, und das Verhältnis jeden Preis des Modells auf den höchsten Preis für seine Marke, gerundet auf dem nächsten 2 Dezimalstellen.

Dieser Code, den ich kenne, ist falsch, weil er einfach den Gesamtpreis (130) wählt.

SELECT Brand, Model, Price, ROUND(Price/(SELECT MAX(Price) FROM Coffee),2) 
as Price_to_Brand_Highest 
FROM Coffee 
ORDER BY Brand; 

Ich versuchte einen Selbstbeitritt, aber alle Verhältnisse kamen als 1 zurück, weil jeder Preis von sich geteilt wurde.

SELECT C1.Brand, C1.Model, C1.Price, ROUND(C1.Price/(SELECT MAX(C2.Price) 
    FROM Coffee where C1.Brand=C2.Brand),2) as Price_to_Brand_Highest 
FROM Coffee C1 
JOIN Coffee C2 on C1.Model=C2.Model 
GROUP BY C1.Model 
ORDER BY C1.Brand; 
+0

Entfernen 'JOIN Kaffee C2 auf C1.Model = C2.Model' und' GROUP BY C1.Model' und alias der Tabelle in der Unterabfrage als 'C2' und multiplizieren Zähler oder Nenner von 1,0 (in der korrelierten Unterabfrage), um eine ganzzahlige Division zu vermeiden. –

Antwort

4

Sie nicht angeben, ein DBMS, so ist dies ANSI-Standard SQL:

select brand, model, price, 
     round(price/max(price) over (partition by brand), 2) as price_ratio 
from coffee 
order by brand, model; 

Online Beispiel: http://rextester.com/HFZZRP41164

+0

Vielen Dank für das Erstellen des Beispiels auf Rextester. Sorry, ich dachte, ich hätte dies als mysql anstatt nur sql markiert, aber das ist das DBMS, das ich benutzt habe. –

2

Vor Fensterfunktionen des SQL-Standards hinzugefügt wurden, ein Verfahren wäre sich einer Unterabfrage anschließen, die den Maximalwert berechnet.

SELECT 
C1.*, 
ROUND(C1.Price/C2.MaxBrandPrice, 2) as Price_to_Brand_Highest 
FROM Coffee C1 
JOIN (
    Select Brand, max(Price) as MaxBrandPrice 
    From Coffee 
    Group by Brand 
) C2 
on (C1.Brand = C2.Brand) 
ORDER BY C1.Brand, C1.Model; 
+0

Danke. Ich glaube, dass dies die Antwort ist, nach der sie in MySQL gesucht haben. –

+0

Dargestellt war es so. Nun, Sie hätten dem Interviewer sagen können, dass er zu MariaDB wechseln soll (was [Fensterfunktionen] (https://mariadb.com/kb/en/mariadb/window-functions/)) und dann die Antwort von @a_horse_with_no_name wäre Kühler Standard-SQL-Lösung. – LukStorms

Verwandte Themen