Saya mencoba menjalankan kueri berikut untuk memberikan% baris di patients
tabel saya yang memiliki nilai refinst
kolom. Saya terus mendapatkan hasil 0.
select (count (refinst) / (select count(*) from patients) * 100) as "Formula"
from patients;
Tabel memiliki 15556 baris, dan select count(refinst) from patients
memberitahu saya bahwa 1446 dari mereka memiliki nilai di refinst
kolom. Respons yang ingin saya dapatkan dari kueri adalah 30,62 ( 1446/15556*100=30.62XXXXX
, dibulatkan menjadi dua desimal).
Saya cukup yakin ini ada hubungannya dengan tipe data dari hasil perhitungan (bilangan bulat yang saya asumsikan). Jika saya membagi integer dengan integer dan hasilnya kurang dari 0 maka terpotong menjadi 0 benar? Jika itu masalahnya, dapatkah seseorang menunjukkan kepada saya cara melemparkan hasil penghitungan sebagai angka dengan 2 tempat desimal sehingga hasilnya akan dibulatkan menjadi 2 tempat desimal juga?
Saya yakin ada cara yang lebih baik untuk menulis kode ini daripada banyak pernyataan hitungan. Saya mencari cara yang lebih efisien prosesor untuk menulis kueri ini secara khusus.
sumber
Jawaban:
Jangan tidak menggunakan subselect. Kedua agregat dapat diturunkan dari kueri yang sama. Lebih murah
Juga, ini bukan kasus untuk fungsi jendela, karena Anda ingin menghitung satu hasil, dan bukan satu hasil per baris.
Lemparkan ke jenis numerik apa pun yang mendukung angka fraksional, seperti yang sudah dijelaskan @a_horse .
Karena Anda ingin
round()
dua digit fraksional saya sarankannumeric
(yang sama sepertidecimal
di Postgres).Tapi itu cukup untuk memasukkan satu nilai yang terlibat dalam perhitungan, lebih disukai yang pertama. Postgres secara otomatis menerima jenis yang tidak kehilangan informasi.
Biasanya merupakan ide bagus untuk berkembang biak sebelum Anda membelah . Ini biasanya meminimalkan kesalahan pembulatan dan lebih murah.
Dalam hal ini, perkalian pertama (
count(refinst) * 100
) dapat dihitung denganinteger
aritmatika murah dan tepat . Hanya kemudian kita dilemparkan kenumeric
dan bagi dengan berikutnyainteger
(yang kita tidak melemparkan tambahan).Dibulatkan menjadi dua digit pecahan:
sumber
Anda perlu memberikan setiap nomor yang terlibat dalam divisi ke jenis yang mendukung desimal:
Anda mungkin juga ingin mencoba fungsi jendela alih-alih sub-kueri skalar. Mungkin lebih cepat:
sumber
Saya menyadari bahwa utas ini sudah berumur beberapa tahun tetapi: cobalah mengalikan dengan 100.0 daripada 100 Itu seharusnya secara otomatis menampilkan hasilnya sebagai float daripada integer.
sumber