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だった