SQL AVG 返回整数

39

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

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

如何使它返回浮点数?我尝试强制类型转换,但是所有 avg_level 的行仍然是整数。


3
ANSI标准中没有定义AVG()函数对整数的行为。一些数据库返回整数,其他数据库返回浮点数。为了获得浮点数,您可以使用显式转换。或者,我所做的是将结果乘以1.0。 - Gordon Linoff
4个回答

61

试着像这样做:

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

我还发现了这个话题,你可以在其中找到另一种方法,但我没有使用它,不确定是否有效。


3
我猜你尝试过使用 CAST(AVG(field) AS FLOAT)AVG(field) 仍会返回相同的答案,即INT类型。将其转换为FLOAT不会对你有所帮助。然而,AVG(CAST(field AS FLOAT))非常不同,可能是你想要的。 [对这个答案的赞同加1] - MatBailie

4
AVG的返回类型取决于传递给函数的表达式的评估类型。例如,如果您想让结果为float,则需要确保列或表达式类型为float。请参考以下图片进行理解:enter image description here

4
铸造更为确定,但是 ...AVG(1.0 * e.employee_level)... 也可以,并且更易读懂。

3
这取决于关系型数据库管理系统。据我所知,许多RDBMS将1.0视为定点数NUMERIC值,而不是浮点数FLOAT。这可能会产生类似的效果,甚至在某些情况下效果更好,但并非完全相同。因此,我倾向于在我的代码中使用显式CAST/CONVERT。这样你就可以 知道 事物的数据类型,而不是依赖于数据类型优先级和隐式转换。 - MatBailie

-1

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

这将在MySQL中起作用 您正在将答案转换为小数点后0位的值,因此这将起作用 假设答案是945.454,那么AVG(Cast(e.employee_level as DECIMAL(10,0)))将给出945 而AVG(Cast(e.employee_level as DECIMAL(10,1)))将给出945.5 希望您得到了答案


请在你的回答中提供更多细节。目前它写得不太明白,很难理解你的解决方案。 - Community
你好,欢迎!请查看为什么全大写字母被认为是不合适和不专业的?。谢谢。 - Eric Aya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接