SQL子查询比较计数:筛选所有记录类型均为'C'的人员
解决方法:筛选所有记录均为'C'的人员
嘿,我明白你的需求了——要找出那些**所有记录类型都是'C'**的人,也就是这个人的记录里完全没有'V'类型的条目。你提到想用子查询来比较总记录数和'C'类型的计数,这思路完全没问题,下面给你几种具体的实现方式:
方法1:用子查询统计总记录数和C类型记录数
这种方法直接对应你最初的思路,先通过子查询算出每个人的总记录数,再和当前查询中C类型的计数做比较:
SELECT person_id, COUNT(*) AS c_record_count FROM your_table WHERE type = 'C' GROUP BY person_id HAVING COUNT(*) = (SELECT COUNT(*) FROM your_table t2 WHERE t2.person_id = your_table.person_id);
逻辑解释:
- 外层查询先统计每个有'C'记录的人的C类型条目数
HAVING子句里的子查询会针对当前分组的person_id,算出这个人的所有记录总数- 当C类型的计数等于总记录数时,就说明这个人没有其他类型(也就是'V')的记录
方法2:用NOT EXISTS更高效地排除有'V'记录的人
如果你的表数据量比较大,这种方法可能性能更好,因为它直接排除那些存在'V'记录的人:
SELECT person_id, COUNT(*) AS c_record_count FROM your_table t1 WHERE type = 'C' AND NOT EXISTS ( SELECT 1 FROM your_table t2 WHERE t2.person_id = t1.person_id AND t2.type = 'V' ) GROUP BY person_id;
逻辑解释:
NOT EXISTS子查询会检查当前person_id是否存在任何'V'类型的记录- 如果不存在,就说明这个人的所有记录都是'C',符合筛选条件
方法3:用HAVING结合条件计数简化逻辑
还有一种更简洁的写法,直接在分组后统计'V'类型的记录数,要求这个数为0:
SELECT person_id, COUNT(*) AS c_record_count FROM your_table GROUP BY person_id HAVING SUM(CASE WHEN type = 'V' THEN 1 ELSE 0 END) = 0;
逻辑解释:
- 先按
person_id分组,统计每个人的所有记录 SUM(CASE...)会计算这个人的'V'类型记录数,当这个数为0时,说明没有'V'记录,所有记录都是'C'
你可以根据自己的表结构和数据量选择最合适的方法,这几种写法都能满足你的需求~
内容的提问来源于stack exchange,提问作者user3671361
相关产品推荐
相关产品推荐

