Сукупна FILTER
положення в Postgres 9.4+
Оскільки Postgres 9.4 існує чистий і швидкий (стандарт 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
складає low
, mid
і high
, якщо NULL або інші значення не беруть участь.
Посилання:
Читайте також нижче.
Postgres 9.3-
Є кілька прийомів:
@Phil надав стандартний спосіб із CASE
заявою (крім sum(1)
, що це не стандартний спосіб). Мені подобається використовувати більш коротку форму:
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;
Якщо ваші значення визначені у вашому запитанні (лише 0
- 10
можливо), спростіть далі:
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;
Трохи коротше, ледь швидше.
Тонкі відмінності
Є тонкі відмінності , коли по порівнянні з sum()
в відповідь Філа :
Найголовніше, за документацією :
Слід зазначити, що, за винятком count
цих функцій, повертає нульове значення, коли не вибрано рядки. Зокрема, sum
жоден рядок не повертає нуля, а не нуля, як можна було очікувати, ...
count(*)
це стандартний спосіб і трохи швидше, ніж sum(1)
. Знову ж таки, застосовується null vs. 0.
Будь-який із цих запитів (включаючи Філа) враховує нульові значення для total
. Якщо це не бажано, використовуйте натомість:
count(score) AS total_not_null
SQL Fiddle в pg 9.3.
db <> скрипка тут, на сторінці 10.