2012-06-19 185 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