SQL Server:聚合函数不起作用?

时间:2016-01-10 00:23:49

标签: sql sql-server database sql-server-2008 aggregate-functions

我已将价目表从csv导入我的SQL Server数据库。这很好。但现在有些奇怪的东西。表名为PRICE,其中包含一列(以及更多)Endprice和总共761行。所有数据类型均为varchar(50)

SELECT MAX(Endprice) 
FROM PRICE

当我希望这个简单的SQL语句在列中显示最高价格时,我得到了错误的结果。我不知道为什么。

结果我获得了98,39,但这确实是错误的,它必须是100,73。

在这里您可以看到部分数据:

Here u can see a part of the data

现在错误的MAX()结果:

enter image description here

但是当我使用MIN功能时,我得到最高的一个!?最小值约为50(截图部分未显示)。

enter image description here`

SELECT Endprice FROM PRICE的结果集是正确的。我在我的智慧结束。

3 个答案:

答案 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)

您的问题是Endpricevarchar(50),因此它正在比较字符串而不是数字,这意味着无论第一个数字的下一个数字是什么,都会有9> 1。您必须将其转换为最大值之前的数字

您还应该考虑做什么@a_horse_with_no_name建议将您的列更改为列类型之类的数字。

这是一个关于如何解决实际问题的例子

select max(cast(endprice as money)) from sample

请在此处查看:http://sqlfiddle.com/#!3/767f6/1

请注意,我使用.作为小数分隔符,它将取决于您的数据库语言设置。