Подтвердить что ты не робот

Postgresql - sql - количество значений true

myCol
------
 true
 true
 true
 false
 false
 null

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

select count(*), count(myCol);

Я получаю 6, 5

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

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

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

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

4b9b3361

Ответ 1

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>

Ответ 2

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

вообще

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

Ответ 3

Передача булевых чисел в целое число и сумму.

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

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

Ответ 4

Так как 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;

Ответ 5

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

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);

Ответ 6

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;

Ответ 7

В 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
;

Ответ 8

SELECT count(*)         -- or count(myCol)
FROM   <table name>     -- replace <table name> with your table
WHERE  myCol = true;

Здесь можно использовать функцию Windowing:

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

-- Outputs:
-- --------------
-- myCol | count
-- ------+-------
--  f    |  2
--  t    |  3
--       |  1

Ответ 9

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

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

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