1. ホーム
  2. sql

[解決済み】PostgreSQLで平均値を小数点以下2桁に丸めるには?

2022-04-07 15:04:32

質問

Ruby gem 'sequel' を使って PostgreSQL を使っています。

小数点以下2桁に丸めたいのですが。

以下は私のコードです。

SELECT ROUND(AVG(some_column),2)    
FROM table

以下のようなエラーが発生します。

PG::Error: ERROR:  function round(double precision, integer) does 
not exist (Sequel::DatabaseError)

以下のコードを実行してもエラーになりません。

SELECT ROUND(AVG(some_column))
FROM table

何が間違っているのか、どなたかご存知ですか?

解決方法は?

PostgreSQLでは round(double precision, integer) . 理由としては @Mike Sherrill「キャット・リコール」。 がコメントで説明しているように、精度を取る round のバージョンは 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)

(上記で、以下の点に注意してください。 float8 の単なる省略形エイリアスです。 double precision . PostgreSQLが出力でそれを展開していることがわかります)。

丸める値をキャストする必要があります。 numeric の2つの引数形式を使用します。 round . を追加するだけです。 ::numeric のような省略形のキャストを使用します。 round(val::numeric,2) .


ユーザーに表示するための書式を設定する場合は round . 使用方法 to_char (を参照してください)。 データ型フォーマット関数 を使用すると、書式を指定することができ、その書式に応じた text の結果は、クライアントの言語で numeric の値として使用することができます。例えば

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

to_char は、書式の一部として数字を丸めてくれます。そのため FM プレフィックスは to_char は、先頭の空白を含むパディングを必要としないことを意味します。