Попробуйте также старый синтаксис для приведения,
SELECT ROUND(AVG(some_column)::numeric,2)
FROM table;
работает с любой версией PostgreSQL.
В некоторых функциях PostgreSQL отсутствуют перегрузки , почему (???): я думаю, что «это недостаток» (!), Но @CraigRinger, @Catcall и команда PostgreSQL согласны с «историческим обоснованием pg».
PS: еще один момент, связанный с округлением - это точность , проверьте ответ @ IanKenney .
Перегрузка как стратегия приведения
Вы можете перегрузить функцию ROUND,
CREATE FUNCTION ROUND(float,int) RETURNS NUMERIC AS $$
SELECT ROUND($1::numeric,$2);
$$ language SQL IMMUTABLE;
Теперь ваша инструкция будет работать нормально, попробуйте (после создания функции)
SELECT round(1/3.,4); -- 0.3333 numeric
но он возвращает тип NUMERIC ... Чтобы сохранить первую перегрузку при использовании commom, мы можем вернуть тип FLOAT, когда предлагается параметр TEXT,
CREATE FUNCTION ROUND(float, text, int DEFAULT 0)
RETURNS FLOAT AS $$
SELECT CASE WHEN $2='dec'
THEN ROUND($1::numeric,$3)::float
-- ... WHEN $2='hex' THEN ... WHEN $2='bin' THEN... complete!
ELSE 'NaN'::float -- like an error message
END;
$$ language SQL IMMUTABLE;
Пытаться
SELECT round(1/3.,'dec',4); -- 0.3333 float!
SELECT round(2.8+1/3.,'dec',1); -- 3.1 float!
SELECT round(2.8+1/3.,'dec'::text); -- need to cast string? pg bug
PS: проверка \df round
после перегрузок, покажет что-то вроде,
Схема | Имя | Тип данных результата | Типы данных аргумента
------------ + ------- + ------------------ + ---------- ------------------
Мыщема круглый | двойная точность | двойная точность, текст, int
Мыщема круглый | числовой | двойная точность, int
pg_catalog | круглый | двойная точность | двойная точность
pg_catalog | круглый | числовой | числовой
pg_catalog | круглый | числовой | числовой, int
Эти pg_catalog
функции являются те , по умолчанию, см руководство по сборке-математических функций .