myCol
------
true
true
true
false
false
null
Pada tabel di atas, jika saya melakukan:
select count(*), count(myCol);
saya mendapat 6, 5
Saya mendapatkan 5
karena tidak menghitung entri nol.
Bagaimana cara menghitung jumlah nilai sebenarnya (3 dalam contoh)?
(Ini adalah penyederhanaan dan saya sebenarnya menggunakan ekspresi yang jauh lebih rumit dalam fungsi hitungan)
Edit ringkasan: Saya juga ingin menyertakan jumlah biasa (*) dalam kueri, jadi tidak bisa menggunakan klausa where
sql
postgresql
EoghanM
sumber
sumber
WHERE myCol = true
di sana jika Anda mau dan jika Anda menghapus yang pertama,*,
itu hanya akan mengembalikan nomornya.Jawaban:
atau, seperti yang Anda temukan sendiri:
sumber
ELSE null
untuk mendapatkan hasil yang sama.Transmisikan Boolean menjadi integer dan jumlah.
Anda mendapatkan
6,3
.sumber
Sejak PostgreSQL 9.4 ada
FILTER
klausul , yang memungkinkan kueri yang sangat ringkas untuk menghitung nilai sebenarnya:Kueri di atas adalah contoh yang buruk karena klausa WHERE yang sederhana sudah cukup, dan hanya untuk mendemonstrasikan sintaks. Di mana klausa FILTER menonjol adalah mudah untuk menggabungkan dengan agregat lain:
Klausa ini sangat berguna untuk agregat di kolom yang menggunakan kolom lain sebagai predikat, sekaligus memungkinkan untuk mengambil agregat yang difilter secara berbeda dalam satu kueri:
sumber
mungkin, pendekatan terbaik adalah dengan menggunakan fungsi nullif.
secara umum
atau singkatnya
http://www.postgresql.org/docs/9.0/static/functions-conditional.html
sumber
nullif([boolean expression], true)
akan ditampilkanfalse
jika [ekspresi boolean] salah, dannull
jika benar, maka Anda akan menghitung nilai yang salah. Saya pikir Anda maunullif([boolean expression], false)
.nullif([boolean expression], false)
membuatnya lebih mudah dibaca. Anda kemudian dapat memvariasikan bagian ekspresi boolean menjadi apa pun yang Anda suka, dalam hal inimyCol = true
untuk menghitung nilai yang benar, ataumyCol = false
untuk menghitung nilai yang salah, atauname='john'
untuk menghitung orang yang disebut john dll.Solusi terpendek dan paling malas (tanpa casting) adalah dengan menggunakan rumus:
Cobalah sendiri:
memberikan hasil yang sama dengan
sumber
Di MySQL, Anda juga dapat melakukan ini:
Saya pikir di Postgres, ini berfungsi:
atau lebih baik (untuk menghindari :: dan menggunakan sintaks SQL standar):
sumber
Atau Mungkin ini
sumber
myCol
ekspresi adalah boolean, Anda dapat mengganti cek denganwhere (myCol)
Cukup ubah bidang boolean menjadi bilangan bulat dan lakukan penjumlahan. Ini akan bekerja pada postgresql:
Semoga membantu!
sumber
Berikut cara dengan Fungsi Windowing:
sumber
WHERE myCol = true
. Saya memberikan contoh kedua bukan karena ini lebih cepat, tetapi lebih sebagai bagian pendidikan untuk fungsi windowing Postgres, yang banyak pengguna tidak nyaman, atau tidak tahu.akan mengelompokkan 3 kemungkinan status bool (false, true, 0) dalam tiga baris terutama berguna saat mengelompokkan bersama dengan kolom lain seperti hari
sumber