首页 > 解决方案 > SQL查询:如何计算列中特定值的出现而不对该列进行分组?

问题描述

我有一张这样的桌子:

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

我知道如何通过加入两个子查询来做到这一点,但是有没有更简单/更快的方法呢?像这样的伪代码:

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

不确定是否有办法做这COUNT(value==a)部分。请帮助。

标签: sqlitegroup-bycountconditionalcase

解决方案


你可以使用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

推荐阅读