2012-06-19 151 views
14

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

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

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

+1

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

回答

26

尝试做这样的:

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

而且我发现this话题在这里你可以找到一些另一种方法,但我没有使用它,不知道究竟是否管用。

+3

@CodeKingPlusPlus - 我想你试过'CAST(AVG(field)AS FLOAT)'? 'AVG(field)'仍然会返回相同的答案,这是一个INT,到时候将其转换为FLOAT不会帮助你。 'AVG(CAST(field AS FLOAT))',然而,是非常不同的,并且可能是你想要的。 * [+ 1到这个答案] * – MatBailie

+0

@Dems是的,你说得对,它似乎相同,但它不是。 – Sajmon

1

铸造更确定,但...AVG(1.0 * e.employee_level)...也可能做到这一点,并且可以更清晰。

+3

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