Saya menggunakan PostgreSQL melalui 'sekuel' Ruby gem.
Saya mencoba membulatkan ke dua tempat desimal.
Ini kode saya:
SELECT ROUND(AVG(some_column),2)
FROM table
Saya mendapatkan kesalahan berikut:
PG::Error: ERROR: function round(double precision, integer) does
not exist (Sequel::DatabaseError)
Saya tidak mendapatkan kesalahan ketika saya menjalankan kode berikut:
SELECT ROUND(AVG(some_column))
FROM table
Adakah yang tahu apa yang saya lakukan salah?
sql
ruby
postgresql
sequel
pengguna1626730
sumber
sumber
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
Jawaban:
PostgreSQL tidak mendefinisikan
round(double precision, integer)
. Untuk alasan @Mike Sherrill 'Cat Recall' menjelaskan dalam komentar, versi putaran yang membutuhkan ketelitian hanya tersedia untuknumeric
.(Pada contoh di atas, perhatikan bahwa
float8
itu hanya alias singkat untukdouble precision
. Anda dapat melihat bahwa PostgreSQL mengembangkannya di output).Anda harus memberikan nilai yang dibulatkan
numeric
ke menggunakan bentuk dua argumenround
. Cukup tambahkan::numeric
untuk pemain steno, sepertiround(val::numeric,2)
.Jika Anda memformat untuk tampilan kepada pengguna, jangan gunakan
round
. Gunakanto_char
(lihat: fungsi pemformatan tipe data dalam manual), yang memungkinkan Anda menentukan format dan memberi Andatext
hasil yang tidak terpengaruh oleh keanehan apa pun yang mungkin dilakukan oleh bahasa klien Anda dengannumeric
nilai. Sebagai contoh:to_char
akan membulatkan angka untuk Anda sebagai bagian dari pemformatan. TheFM
awalan memberitahuto_char
bahwa Anda tidak ingin padding dengan spasi terkemuka.sumber
ROUND(CAST(FLOAT8 '3.1415927' AS NUMERIC),2);
, saya mendapatkan '0,314E1'. Dan saya memiliki kode saya yang ditulisROUND(AVG(val),2)
masih mendapatkan kesalahan yang saya jelaskan dalam pertanyaan saya.ROUND(CAST(FLOAT8 '3.1415927' AS NUMERIC),2);
di PgAdmin dan Ruby. Dengan PgAdmin, saya mendapatkan 3,14, tetapi dengan Ruby (menggunakan he Sequel gem) saya mendapatkan '0,314E1'. Saya ingin tahu mengapa ini ...double
versiround
harus kembalinumeric
atau (ugh)text
, jadi mungkin perlunumeric
argumen.Coba juga sintaks lama untuk casting,
berfungsi dengan semua versi PostgreSQL.
Ada kekurangan kelebihan dalam beberapa fungsi PostgreSQL, mengapa (???): Saya pikir "ini kekurangan" (!), Tetapi @CraigRinger, @Catcall dan tim PostgreSQL sepakat tentang "alasan historis pg".
PS: poin lain tentang pembulatan adalah keakuratan , periksa jawaban @ IanKenney .
Overloading sebagai strategi casting
Anda dapat membebani fungsi ROUND dengan,
Sekarang instruksi Anda akan berfungsi dengan baik, coba (setelah pembuatan fungsi)
tetapi mengembalikan tipe NUMERIC ... Untuk mempertahankan kelebihan penggunaan komom pertama, kita dapat mengembalikan tipe FLOAT ketika parameter TEXT ditawarkan,
Mencoba
PS: memeriksa
\df round
setelah kelebihan beban, akan menunjukkan sesuatu seperti,The
pg_catalog
fungsi adalah orang-orang default, lihat manual build-in fungsi matematika .sumber
Coba dengan ini:
Atau sederhananya:
sumber
Anda dapat menggunakan fungsi di bawah ini
hasilnya akan menunjukkan:
Anda juga dapat melemparkan variabel Anda ke jenis keinginan:
sumber
Menurut respons Bryan, Anda dapat melakukan ini untuk membatasi desimal dalam kueri. Saya mengkonversi dari km / jam ke m / s dan menampilkannya dalam dygraphs tetapi ketika saya melakukannya dalam dygraphs itu terlihat aneh. Terlihat baik-baik saja saat melakukan perhitungan dalam kueri. Ini ada di postgresql 9.5.1.
sumber
Coba casting kolom Anda ke angka seperti:
sumber
Solusi : Anda perlu menambahkan jenis cetakan maka itu akan berhasil
Ex:
round(extract(second from job_end_time_t)::integer,0)
sumber
pilih ROUND (SUM (jumlah) :: numerik, 2) sebagai total_amount DARI transaksi
memberi: 200234.08
sumber