PostgreSQL функция round

Хочу сделать округление числа до двух цифр после запятой:

   SELECT SUM(price), COUNT(price), round(CAST(SUM(price) as real)/CAST(COUNT(price) as real),2) FROM purchases INNER JOIN goods ON purchases.id_good=goods.id_good where date>='2020-05-01' and date<='2020-05-07'

Но при round(CAST(SUM(price) as real)/CAST(COUNT(price) as real),2) таком выражении выдает ошибку

Ошибка SQL:

ERROR:  function round(real, integer) does not exist
LINE 1: ...) AS total FROM (SELECT SUM(price), COUNT(price), round(CAST...
                                                             ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
В операторе:
SELECT COUNT(*) AS total FROM (SELECT SUM(price), COUNT(price), round(CAST(SUM(price) as real)/CAST(COUNT(price) as real),2) FROM purchases INNER JOIN goods ON purchases.id_good=goods.id_good where date>='2020-05-01' and date<='2020-05-07') AS sub

А вот так работает round(CAST(SUM(price) as real)/CAST(COUNT(price) as real),2)


Ответы (1 шт):

Автор решения: Мелкий

Изначально в postgresql есть такие функции round (да, они разные и так и задумано):

melkij=> \df round
                         List of functions
   Schema   | Name  | Result data type | Argument data types | Type 
------------+-------+------------------+---------------------+------
 pg_catalog | round | double precision | double precision    | func
 pg_catalog | round | numeric          | numeric             | func
 pg_catalog | round | numeric          | numeric, integer    | func

Функции round(real, integer) действительно нет. При том форма с двумя аргументами есть только для numeric. То есть, вы пытаетесь привести аргументы функции не к тому типу данных, который нужен.

→ Ссылка