如何计算“分组依据”组中有多少行符合特定条件

gen*_*358 2 sql postgresql group-by count

我有一个表,我希望通过使用某个键对数据进行分组来从中选择数据。对于每个组,我还想计算属于该组的行有多少符合特定标准。即使该组中的 0 行符合条件,我仍然希望返回该组并显示 0 行符合条件的“计数”字段。因此,我不能简单地使用“where”子句过滤掉不需要的行,而是简单地选择组内元素数量的计数。

任何帮助将不胜感激

tri*_*cot 7

我建议CASE WHEN在这个例子中使用(标准 ISO SQL 语法):

SELECT   a.category,
         SUM(CASE WHEN a.is_interesting = 1 THEN 1 END) AS conditional_count,
         COUNT(*) group_count
FROM     a
GROUP BY a.category
Run Code Online (Sandbox Code Playgroud)

这将总结 1 和空值(当条件为假时)的值,这归结为实际计算满足条件的记录。

但是,当没有记录满足条件时,这将返回null。如果你想在这种情况下有 0,你可以这样包装SUM

COALESCE(SUM(CASE WHEN a.is_interesting = 1 THEN 1 END), 0)
Run Code Online (Sandbox Code Playgroud)

或者,更短的,使用COUNT代替SUM

COUNT(CASE WHEN a.is_interesting = 1 THEN 1 END)
Run Code Online (Sandbox Code Playgroud)

因为COUNTTHEN子句中放入什么值并不重要,只要它不为null 即可。它将计算表达式不为null的实例。

ELSE 0子句的添加通常也返回 0 SUM

SUM(CASE WHEN a.is_interesting = 1 THEN 1 ELSE 0 END)
Run Code Online (Sandbox Code Playgroud)

然而,有一种边界情况SUM仍然会返回null。这是当没有GROUP BY条款并且没有记录符合WHERE条款时。例如:

SELECT SUM(CASE WHEN 1 = 1 THEN 1 ELSE 0 END)
FROM   a
WHERE  1 = 0
Run Code Online (Sandbox Code Playgroud)

将返回null,而COUNTorCOALESCE版本仍将返回 0。