SQL Server:聚合函数不起作用?
我已将价目表从csv导入我的SQL Server数据库。这很有效。但现在有些奇怪的东西。表名为PRICE,其中包括一列和更多的Endprice,共761行。所有数据类型都是varchar50 当我希望这个简单的SQL语句在列中显示最高价格时,我得到了一个错误的结果。我不知道为什么 结果是98,39,但这绝对是错误的,它一定是100,73 在这里您可以看到部分数据: 现在是错误的最大结果: 但是当我使用MIN函数时,我得到的是最高的!?最小值约为50,未在屏幕截图部分显示 `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
从价格中选择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:。有没有办法自动添加货币符号?我已将其更改为货币:。有没有办法自动添加货币符号?