MySQL统计布尔值:如何显示分组中计数为0的结果
解决MySQL统计包含0值分组的问题
问题场景
数据库表Registration结构及数据如下:
| StudentID | ActivityNumber | Payed |
|---|---|---|
| 1 | 1 | 1 |
| 2 | 1 | 0 |
| 3 | 1 | 1 |
| 4 | 2 | 0 |
其中Payed为布尔类型,1表示已支付,0表示未支付。
执行以下查询时:
SELECT ActivityNumber, COUNT(*) as TimesPayed FROM Registration WHERE Payed = 1 GROUP BY ActivityNumber
结果不会显示ActivityNumber=2(因为该活动无支付记录);但去掉WHERE子句后,ActivityNumber=2的TimesPayed会被统计为1(因为COUNT(*)会计算所有记录数),不符合需求。期望得到的结果是:
| ActivityNumber | TimesPayed |
|---|---|
| 1 | 2 |
| 2 | 0 |
解决方案
可以用SUM()函数替代COUNT(),结合条件判断来统计支付次数:
方法1:使用SUM(CASE)
SELECT ActivityNumber, SUM(CASE WHEN Payed = 1 THEN 1 ELSE 0 END) as TimesPayed FROM Registration GROUP BY ActivityNumber
方法2:直接SUM(Payed)
因为MySQL中布尔类型会被当作1和0处理,所以可以简化为:
SELECT ActivityNumber, SUM(Payed) as TimesPayed FROM Registration GROUP BY ActivityNumber
这两种方法都会正确统计每个活动的支付人数,包括支付数为0的活动,同时不会把未支付的记录计入统计。
如果你的场景中存在没有任何报名记录的活动(即Registration表中没有对应ActivityNumber的行),那需要先从活动表(比如假设存在Activities表,包含所有活动编号)中获取所有活动,再和Registration表做左连接:
SELECT a.ActivityNumber, COALESCE(SUM(r.Payed), 0) as TimesPayed FROM Activities a LEFT JOIN Registration r ON a.ActivityNumber = r.ActivityNumber GROUP BY a.ActivityNumber
用COALESCE确保没有报名记录的活动统计值显示为0。
内容的提问来源于stack exchange,提问作者Cody_2111
相关产品推荐
相关产品推荐

