sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Cómo redondear un promedio a 2 decimales en PostgreSQL?

PostgreSQL no define round(double precision, integer) . Por razones @Mike Sherrill 'Cat Recall' explica en los comentarios, la versión de ronda que toma una precisión solo está disponible para 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)

(En lo anterior, tenga en cuenta que float8 es solo un alias abreviado para double precision . Puede ver que PostgreSQL lo está expandiendo en la salida).

Debe convertir el valor para redondearlo a numeric para usar la forma de dos argumentos de round . Simplemente agregue ::numeric para la conversión abreviada, como round(val::numeric,2) .

Si está formateando para mostrar al usuario, no use round . Usa to_char (ver:funciones de formato de tipo de datos en el manual), que le permite especificar un formato y le da un text resultado que no se ve afectado por las rarezas que el lenguaje de su cliente pueda hacer con numeric valores. Por ejemplo:

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

to_char redondeará los números por usted como parte del formato. La FM el prefijo le dice a to_char que no desea ningún relleno con espacios iniciales.