Ответ 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>
myCol
------
true
true
true
false
false
null
В приведенной выше таблице, если да:
select count(*), count(myCol);
Я получаю 6, 5
Я получаю 5
, поскольку он не учитывает нулевую запись.
Как также подсчитать количество истинных значений (3 в примере)?
(Это упрощение, и я фактически использую гораздо более сложное выражение в функции count)
Редактировать резюме: я также хочу включить простой запрос (*) в запрос, поэтому не могу использовать предложение where
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>
Вероятно, наилучшим подходом является использование функции 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
Передача булевых чисел в целое число и сумму.
SELECT count(*),sum(myCol::int);
Вы получаете 6,3
.
Так как 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;
Самый короткий и ленивый (без литья) раствор должен был бы использовать формулу:
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);
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;
В 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
;
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
Просто преобразуйте логическое поле в integer и выполните сумму. Это будет работать на postgresql:
select sum(myCol::int) from <table name>
Надеюсь, что это поможет!