SQL同查询用COUNT()统计多条件行数结果异常如何解决
错误原因
你原有写法的问题在于,WHERE子句会先筛选出所有房间数为12或4的共158行数据,后续的COUNT(*)是对这部分筛选后的全量数据计数,所以两个统计字段返回的都是总条数158,无法区分不同条件的计数。
正确写法
最常用的方案是条件聚合,通过CASE WHEN对每行数据做条件判断,仅统计符合对应要求的行:
SELECT COUNT(CASE WHEN num_of_rooms = 'twelve' THEN 1 END) AS house_with_12_rooms, COUNT(CASE WHEN num_of_rooms = 'four' THEN 1 END) AS house_with_4_rooms FROM housetable WHERE num_of_rooms IN ('twelve', 'four');
逻辑说明
COUNT函数仅会统计非NULL值,CASE WHEN不满足对应条件时会返回NULL,因此只会统计符合对应房间数的行。加上WHERE子句可以提前过滤不需要统计的行,提升查询性能。
如果你的数据库支持IF函数(比如MySQL),还可以写得更简化:
SELECT SUM(IF(num_of_rooms = 'twelve', 1, 0)) AS house_with_12_rooms, SUM(IF(num_of_rooms = 'four', 1, 0)) AS house_with_4_rooms FROM housetable WHERE num_of_rooms IN ('twelve', 'four');
执行上述语句后,会返回house_with_12_rooms = 157、house_with_4_rooms = 1的正确结果。
内容的提问来源于stack exchange,提问作者Uriel
相关产品推荐
相关产品推荐

