2017-12-05 3 views
2

Ich habe SQL-Tabelle, wo ich Spalte DISTANCE (varchar50) habe. Es ist Nummer mit Punkt.SQL MAX-Nummer in einer VARCHAR-typisierten Spalte finden

+----+--------+--------+----------+ 
| ID | USERID | MONTH | DISTANCE | 
+----+--------+--------+----------+ 
| 1 | 1 | 201707 | 7.25 | 
+----+--------+--------+----------+ 
| 2 | 2 | 201707 | 9.17 | 
+----+--------+--------+----------+ 
| 3 | 2 | 201707 | 10.31 | 
+----+--------+--------+----------+ 
| 4 | 1 | 201706 | 10.08 | 
+----+--------+--------+----------+ 

Ich möchte MAX-Wert von DISTANCE anzeigen. Wenn ich nach Entfernung DESC Auftrag ist das Ergebnis:

SELECT * FROM mytable ORDER BY distance DESC 
9.17 
7.25 
10.31 
10.08 

Ich versuche, die MAX zu finden, ist aber immer noch nicht richtig

SELECT MAX(distance) AS mvzd FROM mytable 
9.17 

Wie ich richtig max Distanzwert haben kann, die 10.31 mit dem mitgelieferten sein sollte Beispieldaten ?

+0

ich wie mysql fühlen würde die Zeichenfolge zu einem doppelten, wenn möglich, und dann korrekt angezeigt werden 10,31 gegossen. Sind Sie sicher, dass Sie keine Leerzeichen in der DISTANCE-Spalte haben oder etwas, das mysql daran hindern würde, zu casten? – bassxzero

+0

Können Sie Ihre Spalte in einen Datentyp ändern, der mit Ihren Daten übereinstimmt (wie Dezimalzahlen)? –

Antwort

2

PROBLEM

SOLUTION

Sie können die folgende Abfrage verwenden:

select max(cast(distance as decimal(10,2))) AS mvzd FROM mytable 

Durch Ihre vorhandene Abfrage, Sie finden MAX auf einer VARCHAR getippt Spalte und Sie sind richtige Ergebnis zu bekommen, was Sie schrieb! Wenn Sie das gewünschte Ergebnis haben möchten, müssen Sie zuerst den Typ dieser Spalte wie in der obigen Abfrage konvertieren.

+0

Danke Md. Suman Kabir. Ihre Antwort funktioniert perfec :) – Martin

+2

@Martin Bitte upvote und wählen Sie die richtige Antwort :) – RAZERZ

0

Das Problem ist, dass Sie falschen Datentyp der DISTANCE verwenden. In Ihrem Fall speichern Sie die Abstandswerte als varchar und deshalb funktionieren die ORDER BY und MAX() Funktionen nicht wie erwartet - in diesem Fall sortiert ORDER BY Werte als eine Zeichenfolge vom allerersten Zeichen. In Ihrem Beispiel haben Sie versucht, in absteigender Reihenfolge nach dem niedrigsten zu einem größeren Wert zu sortieren - dies wird Ihnen "unerwartete" Ergebnisse geben, wenn ein Wert wie 98.76 oder 111.15 vorliegt.

Alles, was Sie brauchen, ist der Datentyp DISTANCE Spalte float zu setzen - eine kleine Zahl mit einem Fließkomma.

Einstellungen ändern Ihrer Tabelle float zu verwenden:

ALTER TABLE `mytable` 
    CHANGE COLUMN `distance` `distance` 
    FLOAT NULL DEFAULT NULL AFTER `month`; 

gespeicherten Daten als float werden alle nativen Funktionen wie MIN, MAX, ORDER BY usw. unterstützen, die als ohne Abhilfen erwartet funktionieren.

Hier wird am Beispiel float korrigiert: http://sqlfiddle.com/#!9/1f8692/1
Hier erweitert Beispiel mit falschen varchar(50): http://sqlfiddle.com/#!9/4da754e/1

Verwandte Themen