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

SQL Server:聚合函数不起作用?,sql,sql-server,database,sql-server-2008,aggregate-functions,Sql,Sql Server,Database,Sql Server 2008,Aggregate Functions,我已将价目表从csv导入我的SQL Server数据库。这很有效。但现在有些奇怪的东西。表名为PRICE,其中包括一列和更多的Endprice,共761行。所有数据类型都是varchar50 当我希望这个简单的SQL语句在列中显示最高价格时,我得到了一个错误的结果。我不知道为什么 结果是98,39,但这绝对是错误的,它一定是100,73 在这里您可以看到部分数据: 现在是错误的最大结果: 但是当我使用MIN函数时,我得到的是最高的!?最小值约为50,未在屏幕截图部分显示 ` 从价格中选择Endp

我已将价目表从csv导入我的SQL Server数据库。这很有效。但现在有些奇怪的东西。表名为PRICE,其中包括一列和更多的Endprice,共761行。所有数据类型都是varchar50

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

结果是98,39,但这绝对是错误的,它一定是100,73

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

现在是错误的最大结果:

但是当我使用MIN函数时,我得到的是最高的!?最小值约为50,未在屏幕截图部分显示

`


从价格中选择Endprice的结果集是正确的。我束手无策。

这是因为您的列是一个varchar,所以它根据字符确定最小值或最大值。列应该是十进制或货币类型,因此它按数字的值排序,而不是像现在这样按字母排序


字母排序:9大于1,因此98.39是最大值。

这是因为您的列是一个varchar,因此它根据字符确定最小值或最大值。列应该是十进制或货币类型,因此它按数字的值排序,而不是像现在这样按字母排序


字母排序:9大于1,因此98.39是最大值。

原因是价格是一个varchar

以下是两种解决方案:

order by len(price), price
假设所有的价格值都具有相同的结构,则该方法有效

或:

如果将数字存储在错误的数据类型中时可能会出现非数值,则始终存在危险:

order by (case when isnumeric(price) = 1 then cast(price as float) end)
或者更好:

alter table alter column price money

这样,您就不必担心列的类型错误。

原因是price是varchar

以下是两种解决方案:

order by len(price), price
假设所有的价格值都具有相同的结构,则该方法有效

或:

如果将数字存储在错误的数据类型中时可能会出现非数值,则始终存在危险:

order by (case when isnumeric(price) = 1 then cast(price as float) end)
或者更好:

alter table alter column price money
这样,您就不必担心列的类型错误。

您的问题是Endprice列是varchar50,因此它比较的是字符串而不是数字,这意味着无论第一个数字后面出现什么,都是9>1。您必须将其转换为最大值之前的数字

你也应该考虑做什么:“AyHORSESY,No.NoNoID建议把你的列变成一个类似于列类型的数字。

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

select max(cast(endprice as money)) from sample
请看这里:

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

您的问题是Endprice列是varchar50,因此它比较的是字符串而不是数字,这意味着无论第一个数字的下一位出现什么,都是9>1。您必须将其转换为最大值之前的数字

你也应该考虑做什么:“AyHORSESY,No.NoNoID建议把你的列变成一个类似于列类型的数字。

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

select max(cast(endprice as money)) from sample
请看这里:


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

您的问题是Endprice是varchar50,因此它比较的是字符串而不是数字,这意味着无论接下来发生什么,9都大于1。您必须将其转换为最大值之前的数字!永远不要将数字存储为varchar-您刚刚了解了这是一个坏主意的原因之一。谢谢大家!我已经在导入向导中对此进行了监督。但我也有一个想法,这个字符串在内部被解释为一个intetger。对于数据类型money,它工作得很好。您的问题是Endprice是varchar50,因此它比较的是字符串而不是数字,这意味着无论接下来发生什么,9都大于1。您必须将其转换为最大值之前的数字!永远不要将数字存储为varchar-您刚刚了解了这是一个坏主意的原因之一。谢谢大家!我已经在导入向导中对此进行了监督。但我也有一个想法,这个字符串在内部被解释为一个intetger。使用数据类型money,它工作正常。我已将其更改为money:。有没有办法自动添加货币符号?我已将其更改为货币:。有没有办法自动添加货币符号?