PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Hitung persentase dari SUM() dalam kueri sql SELECT yang sama

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, gunakan count(*) untuk totalnya. Lebih cepat, lebih sederhana.

  • Ini mengasumsikan Anda tidak memiliki NULL nilai-nilai. Yaitu. kedua kolom didefinisikan NOT 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 sebelum OR . 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() adalah bigint secara default.
    Sebuah divisi bigint / 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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dapatkan Nama Bulan dari Tanggal di PostgreSQL

  2. Postgres:perintah vakum tidak membersihkan tupel yang mati

  3. Bagaimana cara mendapatkan data lokal ke dalam database hanya-baca menggunakan dplyr?

  4. Dua kolom dalam subquery di mana klausa

  5. Nomor seri per grup baris untuk kunci majemuk