FILTER
Klausa agregat di Postgres 9.4+
Karena Postgres 9.4 ada cara yang bersih dan cepat (standar SQL):
SELECT count(*) FILTER (WHERE score BETWEEN 0 AND 3) AS low
, count(*) FILTER (WHERE score BETWEEN 4 AND 7) AS mid
, count(*) FILTER (WHERE score BETWEEN 8 AND 10) AS high
, count(*) AS total
FROM foo;
total
dijumlahkan low
, mid
dan high
, kecuali NULL atau nilai lain yang terlibat.
Tautan:
Baca juga di bawah ini.
Postgres 9.3-
Ada beberapa teknik:
@Phil memberikan cara standar dengan CASE
pernyataan (kecuali untuk sum(1)
, yang bukan cara standar). Saya suka menggunakan formulir yang lebih pendek:
SELECT count(score BETWEEN 0 AND 3 OR NULL) AS low
, count(score BETWEEN 4 AND 6 OR NULL) AS mid
, count(score BETWEEN 7 AND 10 OR NULL) AS high
, count(*) AS total
FROM foo;
Jika nilai Anda sebagaimana didefinisikan dalam pertanyaan Anda (hanya 0
- 10
mungkin), sederhanakan lebih lanjut:
SELECT count(score < 4 OR NULL) AS low
, count(score BETWEEN 4 AND 6 OR NULL) AS mid
, count(score > 6 OR NULL) AS high
, count(*) AS total
FROM foo;
Sedikit lebih pendek, nyaris tidak lebih cepat.
Perbedaan yang halus
Ada perbedaan halus jika dibandingkan dengan sum()
dalam jawaban Phil :
Yang paling penting, per dokumentasi :
Perlu dicatat bahwa kecuali untuk count
, fungsi-fungsi ini mengembalikan nilai nol ketika tidak ada baris yang dipilih. Secara khusus, sum
tanpa baris mengembalikan nol, bukan nol seperti yang mungkin diharapkan, ...
count(*)
adalah cara standar dan sedikit lebih cepat daripada sum(1)
. Sekali lagi, nol vs 0 berlaku.
Salah satu dari pertanyaan ini (termasuk Phil) menghitung nilai null untuk total
. Jika itu tidak diinginkan, gunakan saja:
count(score) AS total_not_null
SQL Fiddle di halaman 9.3.
db <> biola di sini di halaman 10.