2017-12-05 8 views
2

列のDISTANCE(varchar50)を持つSQLテーブルがあります。それはドットで数字です。SQL VARCHAR型の列のMAX番号の検索

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

DISTANCEのMAX値を表示したいとします。私は、距離DESC ORDER BYの場合、結果は次のとおりです。

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

は私がMAXを見つけることを試みるが、それでも私は提供して10.31をあるべき正しい最大距離値を持つことができますどのように

SELECT MAX(distance) AS mvzd FROM mytable 
9.17 

正しくありません。サンプルデータ ?

+0

私は可能な場合は、二重にあなたの文字列を投じるmysqlのように感じるし、その後正しく10.31を表示します。 DISTANCEカラムにmysqlがキャストできないようなスペースがないかどうか確認してください。 – bassxzero

+0

データを(小数のような)データと一致するデータ型に変更できますか? –

答えて

2

PROBLEM

SOLUTION

あなたは次のクエリを使用することができます:既存のクエリによって

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

を、あなたはVARCHAR型指定された列にMAXを見つけている、あなたは正しい結果を得ている何を書きました!あなたが望む結果を得たい場合は、まず上記のクエリのようにその列の型を変換する必要があります。

+0

Suman Kabirさん、ありがとうございます。あなたの答えはperfec :) – Martin

+2

@マーチンupvoteして、正解を選択してください:) – RAZERZ

0

DISTANCEの間違ったデータ型を使用していることが問題です。あなたの場合は、距離値をvarcharとして保存しています。そのため、ORDER BYMAX()関数が期待どおりに機能しません - この場合、ORDER BYは値を最初の文字からの文字列としてソートしています。あなたの例では、降順で並べ替えようとしました。これは、最小値から最大値に似ています。これは、98.76または111.15のような値があれば、「予期しない」結果をもたらします。

必要なのは、floatDISTANCE列のデータ型を設定することです - 浮動小数点と少数。 floatを使用するようにテーブルの

設定の変更:

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

floatとして格納されたデータは、予想通りの回避策なしで動作するなどMIN、MAX、ORDER BYなどすべてのネイティブ機能をサポートします。ここで

floatを使用した例を補正している。http://sqlfiddle.com/#!9/1f8692/1
ここで間違ったvarchar(50)を使用して、拡張の例である:http://sqlfiddle.com/#!9/4da754e/1