我已将价目表从csv导入我的SQL Server数据库。这很好。但现在有些奇怪的东西。表名为PRICE
,其中包含一列(以及更多)Endprice
和总共761行。所有数据类型均为varchar(50)
。
SELECT MAX(Endprice)
FROM PRICE
当我希望这个简单的SQL语句在列中显示最高价格时,我得到了错误的结果。我不知道为什么。
结果我获得了98,39,但这确实是错误的,它必须是100,73。
在这里您可以看到部分数据:
现在错误的MAX()
结果:
但是当我使用MIN
功能时,我得到最高的一个!?最小值约为50(截图部分未显示)。
SELECT Endprice FROM PRICE
的结果集是正确的。我在我的智慧结束。
答案 0 :(得分:4)
这是因为您的列是varchar,因此它根据字符确定最小值或最大值。该列应为小数或金钱类型,因此它按您的数字值排序(而不是像现在这样的字母排序)。
字母排序:9大于1,因此98.39是最大值
答案 1 :(得分:1)
原因是因为价格是varchar()
。
以下是两个解决方案:
order by len(price), price
这假设所有价格值具有相同的结构。
或者:
order by cast(price as float)
如果您可以使用非数字值(在以错误的数据类型存储数字时始终存在危险):
order by (case when isnumeric(price) = 1 then cast(price as float) end)
或者更好:
alter table alter column price money
然后您不必担心列的类型错误。
答案 2 :(得分:1)
您的问题是Endprice
列varchar(50)
,因此它正在比较字符串而不是数字,这意味着无论第一个数字的下一个数字是什么,都会有9> 1。您必须将其转换为最大值之前的数字
您还应该考虑做什么@a_horse_with_no_name建议将您的列更改为列类型之类的数字。
这是一个关于如何解决实际问题的例子
select max(cast(endprice as money)) from sample
请在此处查看:http://sqlfiddle.com/#!3/767f6/1
请注意,我使用.
作为小数分隔符,它将取决于您的数据库语言设置。