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操作符