Prova anche la vecchia sintassi per il casting,
SELECT ROUND(AVG(some_column)::numeric,2)
FROM table;
funziona con qualsiasi versione di PostgreSQL.
Vi sono carenze di sovraccarichi in alcune funzioni di PostgreSQL, perché (???): penso che sia "mancanza" (!), Ma @CraigRinger, @Catcall e il team PostgreSQL concordano sulla "logica storica di pg".
PS: un altro punto sull'arrotondamento è l' accuratezza , controlla la risposta di @ IanKenney .
Sovraccarico come strategia di lancio
È possibile sovraccaricare la funzione ROUND con,
CREATE FUNCTION ROUND(float,int) RETURNS NUMERIC AS $$
SELECT ROUND($1::numeric,$2);
$$ language SQL IMMUTABLE;
Ora le tue istruzioni funzioneranno bene, prova (dopo la creazione della funzione)
SELECT round(1/3.,4); -- 0.3333 numeric
ma restituisce un tipo NUMERICO ... Per preservare il primo sovraccarico di utilizzo comune, possiamo restituire un tipo FLOAT quando viene offerto un parametro 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;
Provare
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: il controllo \df round
dopo sovraccarichi, mostrerà qualcosa di simile,
Schema | Nome | Tipo di dati risultato | Tipi di dati dell'argomento
------------ + ------- + ------------------ + ---------- ------------------
myschema | tondo | doppia precisione | doppia precisione, testo, int
myschema | tondo | numerico | doppia precisione, int
pg_catalog | tondo | doppia precisione | doppia precisione
pg_catalog | tondo | numerico | numerico
pg_catalog | tondo | numerico | numerico, int
Le pg_catalog
funzioni sono quelle predefinite, vedere il manuale delle funzioni matematiche integrate .