gen*_*358 2 sql postgresql group-by count
我有一个表,我希望通过使用某个键对数据进行分组来从中选择数据。对于每个组,我还想计算属于该组的行有多少符合特定标准。即使该组中的 0 行符合条件,我仍然希望返回该组并显示 0 行符合条件的“计数”字段。因此,我不能简单地使用“where”子句过滤掉不需要的行,而是简单地选择组内元素数量的计数。
任何帮助将不胜感激
我建议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)
因为COUNT在THEN子句中放入什么值并不重要,只要它不为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。
| 归档时间: |
|
| 查看次数: |
3079 次 |
| 最近记录: |