Essayez aussi l'ancienne syntaxe pour la diffusion,
SELECT ROUND(AVG(some_column)::numeric,2)
FROM table;
fonctionne avec n'importe quelle version de PostgreSQL.
Il y a un manque de surcharge dans certaines fonctions PostgreSQL, pourquoi (???): Je pense que "c'est un manque" (!), Mais @CraigRinger, @Catcall et l'équipe de PostgreSQL sont d'accord sur "la logique historique de pg".
PS: un autre point sur l'arrondi est la précision , vérifiez la réponse de @ IanKenney .
Surcharge comme stratégie de casting
Vous pouvez surcharger la fonction ROUND avec,
CREATE FUNCTION ROUND(float,int) RETURNS NUMERIC AS $$
SELECT ROUND($1::numeric,$2);
$$ language SQL IMMUTABLE;
Maintenant, votre instruction fonctionnera correctement, essayez (après la création de la fonction)
SELECT round(1/3.,4);
mais il retourne un type NUMERIC ... Pour conserver la première surcharge d'usage commun, on peut retourner un type FLOAT lorsqu'un paramètre TEXT est proposé,
CREATE FUNCTION ROUND(float, text, int DEFAULT 0)
RETURNS FLOAT AS $$
SELECT CASE WHEN $2='dec'
THEN ROUND($1::numeric,$3)::float
ELSE 'NaN'::float
END;
$$ language SQL IMMUTABLE;
Essayer
SELECT round(1/3.,'dec',4);
SELECT round(2.8+1/3.,'dec',1);
SELECT round(2.8+1/3.,'dec'::text);
PS: vérifier \df round
après les surcharges, affichera quelque chose comme,
Schéma | Nom | Type de données de résultat | Types de données d'argument
------------ + ------- + ------------------ + ---------- ------------------
myschema | rond | double précision | double précision, texte, int
myschema | rond | numérique | double précision, int
pg_catalog | rond | double précision | double precision
pg_catalog | rond | numérique | numérique
pg_catalog | rond | numérique | numérique, entier
Les pg_catalog
fonctions sont celles par défaut, voir le manuel des fonctions mathématiques intégrées .