Я использую PostgreSQL через сиквел Ruby gem.
Я пытаюсь округлить до двух знаков после запятой.
Вот мой код:
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
Кто-нибудь знает, что я делаю не так?
sql
ruby
postgresql
sequel
user1626730
источник
источник
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
Ответы:
PostgreSQL не определяет
round(double precision, integer)
. По причинам, которые @Mike Sherrill объясняет в комментариях «Cat Recall» , версия раунда, которая требует точности, доступна только дляnumeric
.(Обратите внимание, что
float8
это просто сокращенный псевдоним дляdouble precision
. Вы можете видеть, что PostgreSQL расширяет его в выводе).Вы должны привести значение, к которому нужно округлить,
numeric
чтобы использовать форму с двумя аргументамиround
. Просто добавьте::numeric
для стенографии, какround(val::numeric,2)
.Если вы форматируете для отображения пользователю, не используйте
round
. Используйтеto_char
(см. Функции форматирования типов данных в руководстве), что позволяет вам указать формат и получитьtext
результат, на который не влияет какая-либо странность, которую ваш клиентский язык может делать соnumeric
значениями. Например:to_char
будет округлять числа для вас как часть форматирования.FM
Префикс говорит ,to_char
что вы не хотите отступов с ведущими пробелами.источник
ROUND(CAST(FLOAT8 '3.1415927' AS NUMERIC),2);
, я получаю «0.314E1». И мой код написан,ROUND(AVG(val),2)
но я все еще получаю ошибку, описанную в моем вопросе.ROUND(CAST(FLOAT8 '3.1415927' AS NUMERIC),2);
на PgAdmin и Ruby. С PgAdmin я получаю 3.14, но с Ruby (используя гем Sequel) я получаю 0.314E1. Интересно, почему это ...double
версиюround
нужно будет вернутьnumeric
или (тьфу)text
, поэтому она может также принятьnumeric
аргумент.Попробуйте также старый синтаксис для приведения,
работает с любой версией PostgreSQL.
В некоторых функциях PostgreSQL отсутствуют перегрузки , почему (???): я думаю, что «это недостаток» (!), Но @CraigRinger, @Catcall и команда PostgreSQL согласны с «историческим обоснованием pg».
PS: еще один момент, связанный с округлением - это точность , проверьте ответ @ IanKenney .
Перегрузка как стратегия приведения
Вы можете перегрузить функцию ROUND,
Теперь ваша инструкция будет работать нормально, попробуйте (после создания функции)
но он возвращает тип NUMERIC ... Чтобы сохранить первую перегрузку при использовании commom, мы можем вернуть тип FLOAT, когда предлагается параметр TEXT,
Пытаться
PS: проверка
\df round
после перегрузок, покажет что-то вроде,Эти
pg_catalog
функции являются те , по умолчанию, см руководство по сборке-математических функций .источник
Попробуйте с этим:
Или просто:
источник
Вы можете использовать функцию ниже
результат покажет:
Вы также можете привести свою переменную к типу желания:
источник
Согласно ответу Брайана, вы можете сделать это, чтобы ограничить десятичные дроби в запросе. Я конвертирую из км / ч в м / с и отображаю его на графиках, но когда я делал это на графиках, это выглядело странно. Выглядит хорошо, когда вместо этого выполняется вычисление в запросе. Это на postgresql 9.5.1.
источник
Попробуйте привести ваш столбец к числовому типу:
источник
Решение : вам нужно добавить приведение типа, тогда оно будет работать
Пример:
round(extract(second from job_end_time_t)::integer,0)
источник
выберите ROUND (SUM (сумма) :: числовой, 2) в качестве total_amount FROM транзакций
т: 200234.08
источник