PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como arredondar uma média para 2 casas decimais no PostgreSQL?


PostgreSQL não define round(double precision, integer) . Por motivos @Mike Sherrill 'Cat Recall' explica nos comentários, a versão do round que leva uma precisão só está disponível 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)

(No exemplo acima, observe que float8 é apenas um alias abreviado para double precision . Você pode ver que o PostgreSQL o está expandindo na saída).

Você deve converter o valor a ser arredondado para numeric para usar a forma de dois argumentos de round . Basta anexar ::numeric para a conversão abreviada, como round(val::numeric,2) .

Se você estiver formatando para exibição ao usuário, não use round . Use to_char (consulte:funções de formatação de tipo de dados no manual), que permite especificar um formato e fornece um text resultado que não é afetado por qualquer estranheza que sua linguagem cliente possa fazer com numeric valores. Por exemplo:
regress=> SELECT to_char(float8 '3.1415927', 'FM999999999.00');
    to_char    
---------------
 3.14
(1 row)

to_char arredondará os números para você como parte da formatação. O FM prefix informa to_char que você não quer nenhum preenchimento com espaços à esquerda.