Сукупна 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.