myCol
------
true
true
true
false
false
null
在上表中,如果这样做:
select count(*), count(myCol);
我懂了 6, 5
我得到,5
因为它不计算空条目。
如何计算真实值的数量(示例中为3)?
(这是一种简化,实际上我在count函数中使用了一个复杂得多的表达式)
编辑摘要:我也想在查询中包含一个简单的count(*),所以不能使用where子句
myCol
------
true
true
true
false
false
null
在上表中,如果这样做:
select count(*), count(myCol);
我懂了 6, 5
我得到,5
因为它不计算空条目。
如何计算真实值的数量(示例中为3)?
(这是一种简化,实际上我在count函数中使用了一个复杂得多的表达式)
编辑摘要:我也想在查询中包含一个简单的count(*),所以不能使用where子句
WHERE myCol = true
如果需要,可以在其中放一个,如果删除第一个,*,
它将只返回数字。
Answers:
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>
ELSE null
以获得相同的结果。
将布尔值强制转换为整数和。
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;
可能,最好的方法是使用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
nullif([boolean expression], true)
则将返回,因此您将计算假值。我想你要。false
null
nullif([boolean expression], false)
nullif([boolean expression], false)
轻松阅读它。然后,您可以根据自己的喜好改变布尔表达式部分,在这种情况下,myCol = true
可以计算真值,也myCol = false
可以计算假值,或name='john'
计算被称为john等的
最短和最懒惰(无强制转换)的解决方案是使用以下公式:
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);
在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 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;
myCol
expression是布尔值,则可以用where (myCol)
只需将布尔字段转换为整数并求和即可。这将适用于postgresql:
select sum(myCol::int) from <table name>
希望有帮助!
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
WHERE myCol = true
。我提供第二个示例并不是因为它更快,而是更多关于Postgres窗口功能的教育性文章,许多用户对此感到不满意或不知道。