FILTERKlausa 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;
totaldijumlahkan low, middan 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 CASEpernyataan (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- 10mungkin), 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, sumtanpa 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.