Estou usando o PostgreSQL através da 'sequela' da gema Ruby.
Estou tentando arredondar para duas casas decimais.
Aqui está o meu código:
SELECT ROUND(AVG(some_column),2)
FROM table
Estou tendo o erro a seguir:
PG::Error: ERROR: function round(double precision, integer) does
not exist (Sequel::DatabaseError)
Não recebo nenhum erro quando executo o seguinte código:
SELECT ROUND(AVG(some_column))
FROM table
Alguém sabe o que estou fazendo de errado?
sql
ruby
postgresql
sequel
user1626730
fonte
fonte
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
Respostas:
O PostgreSQL não define
round(double precision, integer)
. Por razões que @Mike Sherrill 'Cat Recall' explica nos comentários, a versão da rodada que exige precisão está disponível apenas paranumeric
.(No exemplo acima, observe que este
float8
é apenas um atalho paradouble precision
. Você pode ver que o PostgreSQL está expandindo-o na saída).Você deve converter o valor a ser arredondado
numeric
para usar a forma de dois argumentosround
. Basta acrescentar::numeric
o elenco taquigráfico, comoround(val::numeric,2)
.Se você estiver formatando para exibição para o usuário, não use
round
. Useto_char
(consulte: funções de formatação de tipo de dados no manual), que permite especificar um formato e fornecer umtext
resultado que não é afetado por qualquer estranheza que o idioma do seu cliente possa fazer com osnumeric
valores. Por exemplo:to_char
arredondará números para você como parte da formatação. OFM
prefixo informato_char
que você não deseja nenhum preenchimento com espaços à esquerda.fonte
ROUND(CAST(FLOAT8 '3.1415927' AS NUMERIC),2);
, recebo '0.314E1'. E eu tenho meu código escritoROUND(AVG(val),2)
ainda e recebo o erro que descrevi na minha pergunta.ROUND(CAST(FLOAT8 '3.1415927' AS NUMERIC),2);
de rodar no PgAdmin e Ruby. Com PgAdmin, recebo 3,14, mas com Ruby (usando a jóia Sequel) recebo '0,314E1'. Eu me pergunto por que isso é ...double
versão doround
precisaria retornarnumeric
ou (ugh)text
, para que também poderia ter umnumeric
argumento.Experimente também a sintaxe antiga para transmissão,
funciona com qualquer versão do PostgreSQL.
Faltam sobrecargas em algumas funções do PostgreSQL, por que (???): Eu acho que "é uma falta" (!), Mas @CraigRinger, @Catcall e a equipe do PostgreSQL concordam com a "lógica histórica da pg".
PS: outro ponto sobre o arredondamento é a precisão , verifique a resposta de @ IanKenney .
Sobrecarga como estratégia de fundição
Você pode sobrecarregar a função ROUND com,
Agora sua instrução funcionará bem, tente (após a criação da função)
mas retorna um tipo NUMERIC ... Para preservar a primeira sobrecarga de uso comum, podemos retornar um tipo FLOAT quando um parâmetro TEXT é oferecido,
Experimentar
PS: verificação
\df round
após sobrecargas, mostrará algo como,As
pg_catalog
funções são as padrão, consulte o manual das funções matemáticas integradas .fonte
Tente com isto:
Ou simplesmente:
fonte
você pode usar a função abaixo
o resultado mostrará:
você também pode converter sua variável no tipo de desejo:
fonte
De acordo com a resposta de Bryan, você pode fazer isso para limitar os decimais em uma consulta. Converter de km / h para m / se exibi-lo em dygraphs, mas quando o fiz em dygraphs, parecia estranho. Parece bom ao fazer o cálculo na consulta. Isso está no postgresql 9.5.1.
fonte
Tente converter sua coluna para um numérico como:
fonte
Solução : você precisa adicionar o tipo de conversão para que funcione
Ex:
round(extract(second from job_end_time_t)::integer,0)
fonte
selecione ROUND (SUM (valor) :: numérico, 2) como total_amount FROM transações
dá: 200234.08
fonte