Ada lebih banyak pertanyaan ini daripada yang terlihat.
Versi sederhana
Ini banyak lebih cepat dan lebih sederhana:
SELECT property_name
,(count(value_a = value_b OR NULL) * 100) / count(*) AS pct
FROM my_obj
GROUP BY 1;
Hasil:
property_name | pct
--------------+----
prop_1 | 17
prop_2 | 43
Bagaimana?
-
Anda tidak memerlukan fungsi untuk ini sama sekali.
-
Alih-alih menghitung
value_b
(yang tidak perlu Anda mulai) dan menghitung totalnya, gunakancount(*)
untuk totalnya. Lebih cepat, lebih sederhana. -
Ini mengasumsikan Anda tidak memiliki
NULL
nilai-nilai. Yaitu. kedua kolom didefinisikanNOT NULL
. Informasi tidak ada dalam pertanyaan Anda.
Jika tidak, kueri awal Anda mungkin tidak melakukan apa yang Anda pikirkan . Jika salah satu nilainya NULL, versi Anda tidak menghitung baris itu sama sekali. Anda bahkan bisa memprovokasi pembagian dengan nol pengecualian dengan cara ini.
Versi ini juga berfungsi dengan NULL.count(*)
menghasilkan hitungan semua baris, berapa pun nilainya. -
Begini cara menghitungnya:
TRUE OR NULL = TRUE FALSE OR NULL = NULL
count()
mengabaikan nilai NULL. Voila. -
Prioritas operator mengatur bahwa
=
mengikat sebelumOR
. Anda dapat menambahkan tanda kurung agar lebih jelas:count ((value_a = value_b) OR FALSE)
-
Anda dapat melakukan hal yang sama dengan
count NULLIF(<expression>, FALSE)
-
Jenis hasil
count()
adalahbigint
secara default.
Sebuah divisibigint / bigint
, memotong angka pecahan .
Sertakan angka pecahan
Gunakan 100.0
(dengan digit pecahan) untuk memaksa perhitungan menjadi numeric
dan dengan demikian mempertahankan angka pecahan.
Anda mungkin ingin menggunakan round()
dengan ini:
SELECT property_name
,round((count(value_a = value_b OR NULL) * 100.0) / count(*), 2) AS pct
FROM my_obj
GROUP BY 1;
Hasil:
property_name | pct
--------------+-------
prop_1 | 17.23
prop_2 | 43.09
Sebagai tambahan:
Saya menggunakan value_a
bukannya valueA
. Jangan gunakan pengidentifikasi kasus campuran yang tidak dikutip di PostgreSQL. Saya telah melihat terlalu banyak pertanyaan putus asa yang datang dari kebodohan ini. Jika Anda bertanya-tanya apa yang saya bicarakan, bacalah bab Pengidentifikasi dan Kata Kunci dalam manual.