SQL AVG 返回一个 int

Posted

技术标签:

【中文标题】SQL AVG 返回一个 int【英文标题】:SQL AVG returning an int 【发布时间】:2012-06-21 19:11:15 【问题描述】:

在我的一个查询中,AVG 函数似乎返回了一个 int。

select ..., AVG(e.employee_level)avg_level

如何让它返回浮点值?我尝试转换它,但我所有的 avg_level 行仍然是整数。

【问题讨论】:

在 ANSI 标准中没有定义 AVG() 函数对整数的行为。一些数据库返回一个整数;其他数据库返回一个浮点数。要获得浮点数,您可以使用显式转换/转换。或者,我所做的只是乘以 1.0。 【参考方案1】:

尝试这样做:

AVG(Cast(e.employee_level as Float)) as avg_level

我还找到了this 主题,您可以在其中找到另一种方法,但我没有使用它,也不知道确切是否有效。

【讨论】:

@CodeKingPlusPlus - 我猜你试过CAST(AVG(field) AS FLOAT)AVG(field) 仍将返回相同的答案,即 INT,此时将其转换为 FLOAT 对您没有帮助。但是,AVG(CAST(field AS FLOAT)) 非常不同,可能是您想要的。 [对此答案+1]【参考方案2】:

选角更确定,但...AVG(1.0 * e.employee_level)... 也可以这样做,而且更清晰。

【讨论】:

这取决于 RDBMS。 AFAIK 许多 RDBMS 将 1.0 视为定点 NUMERIC 值,而不是 FLOAT。类似的效果,在这种情况下可能更好,但不完全相同。出于这个原因,我倾向于在我的代码中使用显式的 CAST/CONVERT。然后你知道什么是数据类型,而不是依赖于数据类型的精确度和隐式转换。【参考方案3】:

AVG 的返回类型取决于传递给函数的表达式的评估类型。

例如,如果您希望结果为float,则需要确保您的列或表达式类型为float

【讨论】:

【参考方案4】:

AVG(Cast(e.employee_level as DECIMAL(10,O))

这将在 mysql 中工作 您正在使用 ANS 将值设置为 0 小数,这样就可以了 假设 ANS 是 945.454 所以 AVG(Cast(e.employee_level as DECIMAL(10,O)) 将给出 945 AND AVG(Cast(e.employee_level as DECIMAL(10,1)) 将给出 945.5 希望你得到答案

【讨论】:

请在您的回答中提供更多详细信息。正如目前所写的那样,很难理解您的解决方案。 您好,欢迎您!请查看Why is it considered inappropriate and unprofessional to type in all capital letters?。谢谢。

以上是关于SQL AVG 返回一个 int的主要内容,如果未能解决你的问题,请参考以下文章

LINQ to SQL语句Count/Sum/Min/Max/Avg操作符

LINQ to SQL Count/Sum/Min/Max/Avg Join

在 SQL 查询中使用 avg() 函数只返回一行?

SQL-SQL函数Aggregate 函数

使用 AVG 时返回多行

sql学习1----函数