【问题标题】:SQL Server : aggregate function doesn't work?SQL Server:聚合函数不起作用?
【发布时间】:2016-04-14 12:36:21
【问题描述】:

我已将价目表从 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 的结果集是正确的。我无计可施。

【问题讨论】:

  • 您的问题是 Endprice 是 varchar(50),因此它比较的是字符串而不是数字,这意味着无论接下来发生什么都是 9>1。您必须将其转换为最大值之前的数字!
  • 永远不要将号码存储为varchar - 您刚刚了解到这是一个坏主意的原因之一。
  • 非常感谢大家!我在导入向导中对此进行了监督。但我也认为这个字符串在内部被解释为一个整数。使用数据类型 money,它可以正常工作。

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


【解决方案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

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

【讨论】:

    【解决方案2】:

    原因是因为价格是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
    

    那么您不必担心列的类型错误。

    【讨论】:

    • 我已将其更改为金钱 :)。有没有办法自动添加货币符号?
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2013-08-14
      • 2020-08-05
      • 1970-01-01
      • 2017-01-29
      • 2014-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-02
      相关资源
      最近更新 更多