我有SQL表,我有列DISTANCE(varchar50)。这是带点的数字。
+----+--------+--------+----------+
| ID | USERID | MONTH | DISTANCE |
+----+--------+--------+----------+
| 1 | 1 | 201707 | 7.25 |
+----+--------+--------+----------+
| 2 | 2 | 201707 | 9.17 |
+----+--------+--------+----------+
| 3 | 2 | 201707 | 10.31 |
+----+--------+--------+----------+
| 4 | 1 | 201706 | 10.08 |
+----+--------+--------+----------+
我想显示MAX值od DISTANCE。如果我按距离DESC进行ORDER,结果为:
SELECT * FROM mytable ORDER BY distance DESC
9.17
7.25
10.31
10.08
我试图找到MAX但仍然不正确
SELECT MAX(distance) AS mvzd FROM mytable
9.17
如何使用提供的样本数据获得正确的最大距离值10.31
?
答案 0 :(得分:2)
您可以使用以下查询:
select max(cast(distance as decimal(10,2))) AS mvzd FROM mytable
根据您现有的查询,您在MAX
类型列上找到了VARCHAR
,并且您获得了正确的结果!如果你想得到你想要的结果,首先你必须转换那个列的类型,就像我在上面的查询中所做的那样。
答案 1 :(得分:0)
问题是您使用DISTANCE
的错误数据类型。在您的情况下,您将距离值存储为varchar
以及ORDER BY
和MAX()
函数无法按预期工作的原因 - 在这种情况下,ORDER BY
是将值排序为第一个字符的字符串。在你的例子中,你试图按从低到大的顺序排序 - 这将给你"意外"结果如果有值像98.76或111.15。
您只需要将DISTANCE
列的数据类型设置为 float
- 一个带浮动小数点的小数字。
更改表格的设置以使用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