为何多个CASE WHEN函数返回相同值?SQL计数查询问题
SQL计数结果一致问题的修复方案
你的查询里所有计数结果完全一致,核心问题出在COUNT函数的使用逻辑,同时存在字段名与需求不匹配的问题:
- COUNT函数的特性:它会统计所有非NULL的记录。你的CASE语句不管条件是否满足,都返回1或0(均为非NULL值),所以每个COUNT统计的都是分组后的总行数,结果自然全部相同。
- 字段名不匹配:需求明确指定用
feedback字段(取值0-5)、iteration字段标识迭代次数,但查询里混用了rate、client_feedback、index,这会导致统计逻辑偏离需求。
修正后的SQL查询
select DATE_FORMAT(created_at,'%M') as Month, -- 统计所有评分≥1的行数 SUM(CASE WHEN feedback >= 1 THEN 1 ELSE 0 END) AS total, -- 统计评分为1的行数 SUM(CASE WHEN feedback = 1 THEN 1 ELSE 0 END) AS Rated_1, -- 统计评分为1且为任务首次迭代的行数 SUM(CASE WHEN feedback = 1 AND iteration = 0 THEN 1 ELSE 0 END) AS first_iteration_rated_1 from tablexxx where created_at between date('2022-04-01') and date('2022-10-01') GROUP BY Month
另一种等价写法(利用COUNT忽略NULL的特性)
可以让CASE在不满足条件时返回NULL,这样COUNT只会统计满足条件的记录:
select DATE_FORMAT(created_at,'%M') as Month, COUNT(CASE WHEN feedback >= 1 THEN 1 END) AS total, COUNT(CASE WHEN feedback = 1 THEN 1 END) AS Rated_1, COUNT(CASE WHEN feedback = 1 AND iteration = 0 THEN 1 END) AS first_iteration_rated_1 from tablexxx where created_at between date('2022-04-01') and date('2022-10-01') GROUP BY Month
内容的提问来源于stack exchange,提问作者Michael Meleady
相关产品推荐
相关产品推荐

