SQL按主键分组统计多列中数字3的出现次数问题
按主键分组统计多列中数字3出现次数的正确SQL写法
嘿,我来帮你搞定这个问题!首先得明确你的核心需求:按主键(PK)分组,统计指定多列里数字3的出现次数——可能是每个主键下所有列的3总次数,也可能是每列单独统计3的次数,我都给你梳理清楚。
场景1:主键唯一(每行对应一个主键)
如果你的主键在表中是唯一的,每行只有一个主键值,那我们只需要逐列判断是否等于3,把符合条件的列数加起来就行:
SELECT pk_id, -- 替换成你的实际主键列名 ( CASE WHEN col1 = 3 THEN 1 ELSE 0 END + CASE WHEN col2 = 3 THEN 1 ELSE 0 END + CASE WHEN col3 = 3 THEN 1 ELSE 0 END -- 可以继续添加更多需要统计的列 ) AS total_3_occurrences FROM your_table; -- 替换成你的实际表名
场景2:主键不唯一(多行对应同一个主键)
如果同一个主键对应多行数据,那需要先计算每行的3出现次数,再按主键求和:
SELECT pk_id, SUM( CASE WHEN col1 = 3 THEN 1 ELSE 0 END + CASE WHEN col2 = 3 THEN 1 ELSE 0 END + CASE WHEN col3 = 3 THEN 1 ELSE 0 END ) AS total_3_occurrences FROM your_table GROUP BY pk_id;
场景3:按主键分组,同时统计每列的3出现次数
要是你需要同时知道每个主键下每列各自有多少个3,以及总次数,可以这么写:
SELECT pk_id, SUM(CASE WHEN col1 = 3 THEN 1 ELSE 0 END) AS col1_3_count, SUM(CASE WHEN col2 = 3 THEN 1 ELSE 0 END) AS col2_3_count, SUM(CASE WHEN col3 = 3 THEN 1 ELSE 0 END) AS col3_3_count, SUM( CASE WHEN col1 = 3 THEN 1 ELSE 0 END + CASE WHEN col2 = 3 THEN 1 ELSE 0 END + CASE WHEN col3 = 3 THEN 1 ELSE 0 END ) AS total_3_count FROM your_table GROUP BY pk_id;
常见错误点提醒
很多人会踩的坑是直接用COUNT(col1 = 3),这在大部分数据库里是行不通的——因为col1 = 3返回的是布尔值,COUNT会把所有非NULL的布尔值都算成1,不管是TRUE还是FALSE。所以必须用CASE语句把符合条件的转化为1,不符合的转化为0,再用SUM来统计数量。
内容的提问来源于stack exchange,提问作者Ada S
相关产品推荐
相关产品推荐

