AVG関数の戻り値
細かい話ですが、AVGの戻り値はREAL型のようなので、明示的に変換しないと精度が失われます。*1
明示的にキャストすることで回避出来ます。(マニュアルにも記載あり)
厄介なことに、下手にCASE式で使うと他の条件の場合も精度落ちします。注意。
CREATE MULTISET TABLE test (val AS DECIMAL(10,3)); INSERT INTO test (val) VALUES (500.811); INSERT INTO test (val) VALUES (166.274); SELECT 500.811 + 166.274, -- SUMと同等 CASE WHEN 1 = 1 THEN SUM(val) ELSE AVG(val) END -- 必ずSUMが実行される FROM test;
上記実行結果
(500.811+166.274) | |
667.085 | 667.09 |
なお、REALからDECIMALへのキャスト時に、指定した桁数以下は設定に関係なく切り捨てられるため注意。四捨五入が必要な場合は2段階でキャストするしかなさそう
*1:TYPE関数使ったらFLOATだった