MySQL求助:计算各id的通过率(现有查询结果错误)
解决MySQL计算每个id通过率的问题
我来帮你修正这个查询!你的原语句之所以返回错误结果,核心问题是逻辑完全搞反了:
- 子查询
(SELECT COUNT(Result) FROM aa WHERE Result = 'Pass')统计的是整个表中所有Pass的记录数,而不是当前id对应的Pass数量 - 你把全局的
Pass总数作为分母,但正确的分母应该是每个id自己的总记录数
正确的查询写法(两种可选)
方法一:用CASE表达式精准统计Pass数量
SELECT id, ROUND(COUNT(CASE WHEN Result = 'Pass' THEN 1 END) * 100.0 / COUNT(*), 2) AS Percent FROM aa GROUP BY id;
COUNT(CASE WHEN Result = 'Pass' THEN 1 END):只统计当前id下Result为Pass的记录(不符合条件的会被视为NULL,COUNT不会统计NULL)COUNT(*):统计当前id的总记录数- 乘以
100.0是为了避免MySQL的整数除法陷阱(如果用纯整数运算,结果会被强制取整) ROUND(..., 2)用来保留两位小数,你可以根据需求调整位数
方法二:用SUM+IF简化统计逻辑
SELECT id, ROUND(SUM(IF(Result = 'Pass', 1, 0)) * 100.0 / COUNT(*), 2) AS Percent FROM aa GROUP BY id;
SUM(IF(Result = 'Pass', 1, 0)):把Pass记录计为1,Fail计为0,求和后直接得到当前id的Pass总数- 其余逻辑和方法一完全一致
验证示例
就拿你说的id=2的情况:2条Pass、2条Fail,用上面的查询会计算2*100.0/4=50.00,正好得到正确的50%通过率。
内容的提问来源于stack exchange,提问作者Herbert
相关产品推荐
相关产品推荐

