2012-06-19 13 views
14

私のクエリの1つで、AVG関数がintを返すようです。SQL AVGがintを返す

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

浮動小数点値を返すにはどうすればよいですか?私はキャストしようとしましたが、avg_levelのすべての行はまだ整数でした。

+1

整数に対するAVG()関数の動作は、ANSI標準では定義されていません。一部のデータベースは整数を返します。他のデータベースは浮動小数点数を返します。浮動小数点数を取得するには、明示的なキャスト/変換を使用できます。あるいは、私がしているのは単純に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(フィールドASのFLOAT))'は、しかし、非常に異なり、おそらくあなたが望むものです。 * [+1をこの答えに] * – MatBailie

+0

@Demsはい、そうです、それは同じではないようです。 – Sajmon

1

キャスティングはより確実ですが、...AVG(1.0 * e.employee_level)...でも可能ですし、読みやすくすることができます。

+3

これはRDBMSによって異なります。 AFAIK多くのRDBMSは、FLOATではなく、固定小数点数値として '1.0'を扱います。同様の効果、場合によってはこの場合はさらに良いが、全く同じではない。この理由から私はコード内で明示的なCAST/CONVERTを好む傾向があります。次に、データ型の序数と暗黙の変換に頼るのではなく、どのようなデータ型があるかを知ります。 – MatBailie