SQL 服务器:聚合函数不起作用?
SQL Server : aggregate function doesn't work?
我已将价目表从 csv 导入我的 SQL 服务器数据库。效果很好。但是现在有些奇怪的东西。 Table 被命名为 PRICE
,其中包括一列(以及更多列)Endprice
和总共 761 行。所有数据类型都是 varchar(50)
.
SELECT MAX(Endprice)
FROM PRICE
当我希望这个简单的 SQL 语句显示列中的最高价格时,我得到了错误的结果。我不知道为什么。
结果我得到了 98,39,但这绝对是错误的,它必须是 100,73。
这里可以看到部分数据:
现在错误的 MAX()
结果:
但是当我使用 MIN
函数时,我得到了最高的一个!?最小值在 ~50 左右(屏幕截图部分未显示)。
`
SELECT Endprice FROM PRICE
的结果集是正确的。我已经无计可施了。
这是因为你的列是varchar,所以它是根据字符确定最小值或最大值。该列应该是小数或货币类型,因此它按您的数字值排序(而不是像您现在得到的那样按字母顺序排序)。
字母排序:9大于1,所以98.39是最大值
原因是因为价格是varchar()
.
这里有两种解决方法:
order by len(price), price
假设所有价格值都具有相同的结构,这将起作用。
或者:
order by cast(price as float)
如果你可以有 non-numeric 个值(以错误的数据类型存储数字时总是很危险):
order by (case when isnumeric(price) = 1 then cast(price as float) end)
或者更好:
alter table alter column price money
这样你就不用担心列的类型不对了。
您的问题是 Endprice
列是 varchar(50)
,因此它比较的是字符串而不是数字,这意味着无论第一个数字的下一个数字是什么,9>1。 max前必须转成数字!
此外,您确实应该考虑按照@a_horse_with_no_name的建议将您的列更改为类似列类型的数字。
这是您如何解决实际问题的示例
select max(cast(endprice as money)) from sample
在这里查看:http://sqlfiddle.com/#!3/767f6/1
请注意,我使用 .
作为小数点分隔符,这取决于您的数据库语言设置。
我已将价目表从 csv 导入我的 SQL 服务器数据库。效果很好。但是现在有些奇怪的东西。 Table 被命名为 PRICE
,其中包括一列(以及更多列)Endprice
和总共 761 行。所有数据类型都是 varchar(50)
.
SELECT MAX(Endprice)
FROM PRICE
当我希望这个简单的 SQL 语句显示列中的最高价格时,我得到了错误的结果。我不知道为什么。
结果我得到了 98,39,但这绝对是错误的,它必须是 100,73。
这里可以看到部分数据:
现在错误的 MAX()
结果:
但是当我使用 MIN
函数时,我得到了最高的一个!?最小值在 ~50 左右(屏幕截图部分未显示)。
SELECT Endprice FROM PRICE
的结果集是正确的。我已经无计可施了。
这是因为你的列是varchar,所以它是根据字符确定最小值或最大值。该列应该是小数或货币类型,因此它按您的数字值排序(而不是像您现在得到的那样按字母顺序排序)。
字母排序:9大于1,所以98.39是最大值
原因是因为价格是varchar()
.
这里有两种解决方法:
order by len(price), price
假设所有价格值都具有相同的结构,这将起作用。
或者:
order by cast(price as float)
如果你可以有 non-numeric 个值(以错误的数据类型存储数字时总是很危险):
order by (case when isnumeric(price) = 1 then cast(price as float) end)
或者更好:
alter table alter column price money
这样你就不用担心列的类型不对了。
您的问题是 Endprice
列是 varchar(50)
,因此它比较的是字符串而不是数字,这意味着无论第一个数字的下一个数字是什么,9>1。 max前必须转成数字!
此外,您确实应该考虑按照@a_horse_with_no_name的建议将您的列更改为类似列类型的数字。
这是您如何解决实际问题的示例
select max(cast(endprice as money)) from sample
在这里查看:http://sqlfiddle.com/#!3/767f6/1
请注意,我使用 .
作为小数点分隔符,这取决于您的数据库语言设置。