PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come arrotondare una media a 2 cifre decimali in PostgreSQL?

PostgreSQL non definisce round(double precision, integer) . Per motivi @Mike Sherrill 'Cat Recall' spiega nei commenti, la versione di round che richiede una precisione è disponibile solo per numeric .

regress=> SELECT round( float8 '3.1415927', 2 );
ERROR:  function round(double precision, integer) does not exist

regress=> \df *round*
                           List of functions
   Schema   |  Name  | Result data type | Argument data types |  Type  
------------+--------+------------------+---------------------+--------
 pg_catalog | dround | double precision | double precision    | normal
 pg_catalog | round  | double precision | double precision    | normal
 pg_catalog | round  | numeric          | numeric             | normal
 pg_catalog | round  | numeric          | numeric, integer    | normal
(4 rows)

regress=> SELECT round( CAST(float8 '3.1415927' as numeric), 2);
 round 
-------
  3.14
(1 row)

(In quanto sopra, nota che float8 è solo un alias abbreviato per double precision . Puoi vedere che PostgreSQL lo sta espandendo nell'output).

Devi eseguire il cast del valore da arrotondare a numeric per usare la forma a due argomenti di round . Basta aggiungere ::numeric per il cast abbreviato, come round(val::numeric,2) .

Se stai formattando per la visualizzazione all'utente, non utilizzare round . Usa to_char (vedi:funzioni di formattazione del tipo di dati nel manuale), che ti consente di specificare un formato e ti fornisce un text risultato che non è influenzato dalle stranezze che la tua lingua client potrebbe fare con numeric valori. Ad esempio:

regress=> SELECT to_char(float8 '3.1415927', 'FM999999999.00');
    to_char    
---------------
 3.14
(1 row)

to_char arrotonderà i numeri per te come parte della formattazione. Il FM il prefisso dice a to_char che non vuoi alcun riempimento con spazi iniziali.