按文化分组统计标记为“good”的食品数量的SQL问题
解决按文化分组统计"good"食品数量的SQL问题
问题原因
你之前的语句用COUNT(good = 1)或COUNT(good = true)之所以不对,是因为COUNT()会统计所有非NULL的结果。而good = 1的判断结果要么是true要么是false,这两个值都不属于NULL,所以不管good是0还是1,所有行都会被计入统计,自然得到的是每组的总记录数,而非"good"食品的数量。
正确写法
这里提供三种可行的方案,按需选择:
方案一:用SUM替代COUNT(最简洁)
利用数值计算中布尔值true等价于1、false等价于0的特性,直接求和得到符合条件的数量:SELECT SUM(good = 1) AS good_food_count, culture FROM animals_db.foods GROUP BY culture;如果你的
good字段本身就是布尔类型,还可以简化成:SELECT SUM(good) AS good_food_count, culture FROM animals_db.foods GROUP BY culture;方案二:CASE表达式配合COUNT
通过CASE只在条件满足时返回非NULL值,让COUNT只统计符合要求的记录:SELECT COUNT(CASE WHEN good = 1 THEN 1 END) AS good_food_count, culture FROM animals_db.foods GROUP BY culture;方案三:先过滤再统计(仅适用于不需要保留无"good"食品的分组)
如果你的需求只关注有"good"食品的文化分组,可以先用WHERE过滤掉不符合条件的记录,再分组统计:SELECT COUNT(*) AS good_food_count, culture FROM animals_db.foods WHERE good = 1 GROUP BY culture;
内容的提问来源于stack exchange,提问作者DennisM
相关产品推荐
相关产品推荐

