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

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

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

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

【问题讨论】:

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

标签: sql casting floating-point average


【解决方案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 希望你得到答案

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多