postgresql - sql - количество значений `true` - PullRequest
78 голосов
/ 22 марта 2011
myCol
------
 true
 true
 true
 false
 false
 null

В приведенной выше таблице, если я сделаю:

select count(*), count(myCol);

Я получаю 6, 5

Я получаю 5, поскольку он не учитывает нулевую запись.

Как мне также посчитать количество истинных значений (3 в примере)?

(Это упрощение, и я на самом деле использую гораздо более сложное выражение в функции count)

Редактировать сводку: я также хочу включить в запрос простой подсчет (*), поэтому не могу использовать предложение where

Ответы [ 9 ]

109 голосов
/ 22 марта 2011
SELECT COALESCE(sum(CASE WHEN myCol THEN 1 ELSE 0 END),0) FROM <table name>

или, как вы сами узнали:

SELECT count(CASE WHEN myCol THEN 1 END) FROM <table name>
61 голосов
/ 03 января 2014

Приведите логическое значение к целому числу и сумме.

SELECT count(*),sum(myCol::int);

Вы получите 6,3.

51 голосов
/ 20 мая 2016

Начиная с PostgreSQL 9.4 есть предложение FILTER , которое позволяет очень краткому запросу подсчитывать истинные значения:

select count(*) filter (where myCol)
from tbl;

Приведенный выше запрос является плохим примером в том, чтодостаточно простого предложения WHERE, и оно предназначено только для демонстрации синтаксиса.Идея FILTER блестяще в том, что ее легко комбинировать с другими агрегатами:

select count(*), -- all
       count(myCol), -- non null
       count(*) filter (where myCol) -- true
from tbl;

Предложение особенно удобно для агрегатов в столбце, в котором в качестве предиката используется другой столбец, позволяя при этом извлекать по-разному отфильтрованные агрегаты.в одном запросе:

select count(*),
       sum(otherCol) filter (where myCol)
from tbl;
44 голосов
/ 31 августа 2011

вероятно, лучший подход - использовать нулевую функцию.

в общем

select
    count(nullif(myCol = false, true)),  -- count true values
    count(nullif(myCol = true, true)),   -- count false values
    count(myCol);

или вкратце

select
    count(nullif(myCol, true)),  -- count false values
    count(nullif(myCol, false)), -- count true values
    count(myCol);

http://www.postgresql.org/docs/9.0/static/functions-conditional.html

16 голосов
/ 23 сентября 2015

Самое короткое и ленивое (без приведения) решение будет использовать формулу:

SELECT COUNT(myCol OR NULL) FROM myTable;

Попробуйте сами:

SELECT COUNT(x < 7 OR NULL)
   FROM GENERATE_SERIES(0,10) t(x);

дает тот же результат, что и

SELECT SUM(CASE WHEN x < 7 THEN 1 ELSE 0 END)
   FROM GENERATE_SERIES(0,10) t(x);
7 голосов
/ 24 декабря 2017

Просто конвертируйте логическое поле в целое и сделайте сумму. Это будет работать на postgresql:

select sum(myCol::int) from <table name>

Надеюсь, это поможет!

7 голосов
/ 22 марта 2011
select f1,
       CASE WHEN f1 = 't' THEN COUNT(*) 
            WHEN f1 = 'f' THEN COUNT(*) 
            END AS counts,
       (SELECT COUNT(*) FROM mytable) AS total_counts
from mytable
group by f1

Или, может быть, это

SELECT SUM(CASE WHEN f1 = 't' THEN 1 END) AS t,
       SUM(CASE WHEN f1 = 'f' THEN 1 END) AS f,
       SUM(CASE WHEN f1 NOT IN ('t','f') OR f1 IS NULL THEN 1 END) AS others,
       SUM(CASE WHEN f1 IS NOT NULL OR f1 IS NULL THEN 1 ELSE 0 END) AS total_count
FROM mytable;
6 голосов
/ 22 марта 2011

В MySQL вы также можете сделать это:

SELECT count(*) AS total
     , sum(myCol) AS countTrue --yes, you can add TRUEs as TRUE=1 and FALSE=0 !!
FROM yourTable
;

Я думаю, что в Postgres это работает:

SELECT count(*) AS total
     , sum(myCol::int) AS countTrue --convert Boolean to Integer
FROM yourTable
;

или лучше (чтобы избежать :: и использовать стандартный синтаксис SQL):

SELECT count(*) AS total
     , sum(CAST(myCol AS int)) AS countTrue --convert Boolean to Integer
FROM yourTable
;
4 голосов
/ 22 марта 2011
SELECT count(*)         -- or count(myCol)
FROM   <table name>     -- replace <table name> with your table
WHERE  myCol = true;

Вот способ с функцией управления окнами:

SELECT DISTINCT *, count(*) over(partition by myCol)
FROM   <table name>;

-- Outputs:
-- --------------
-- myCol | count
-- ------+-------
--  f    |  2
--  t    |  3
--       |  1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...