SQL 问题:如何在不对该列进行分组的情况下计算该列中特定值的出现次数?

SQL Query: How to count occurrence of a specific value in a column without grouping on that column?

我有一个 table 这样的:

id | value
1  | a
1  | a
1  | b
1  | c
2  | a
2  | a
2  | a 
2  | c

而我想要count(*) by id然后count(value==a) by id,这意味着这是想要的结果:

id | total_counts | a_counts
1  |      4       |   2 
2  |      4       |   3

我知道如何通过连接两个子查询来实现,但是有 easier/faster 方法吗?就像这个伪代码:

SELECT id, COUNT(*) AS total_counts, COUNT(value==a) AS a_counts
FROM table
GROUP BY id 

不确定是否有办法完成 COUNT(value==a) 部分。请帮忙。

您可以使用 SUM:

SELECT id, COUNT(*) AS total_counts, SUM(value='a') AS a_counts
FROM table
GROUP BY id;

或者如果你有 SQLite 3.25,你可以使用窗口版本:

SELECT /*DISTINCT*/
     id,
     COUNT(*) OVER(PARTITION BY id) AS total_counts,
     COUNT(*) FILTER (WHERE value = 'a') OVER(PARTITION BY id) AS a_counts
FROM tab