mysql带条件的计数

在网站开发的过程中,经常会用到数据统计功能,因此条件计数查询便是不可避免的,下面介绍几种方法来解决此问题。

例(假设):

mysql> select * from count_demo;
+-------+------+-----+
| class | pass | sex |
+-------+------+-----+
|     2 |    1 ||
|     2 |    0 ||
|     1 |    1 ||
|     3 |    1 ||
|     5 |    1 ||
|     4 |    0 ||
|     1 |    0 ||
|     2 |    1 ||
|     6 |    0 ||
+-------+------+-----+

9 rows in set

现有统计一个年级某项考试通过记录表如上(class代表班级,pass表示考试是否通过,1为通过,0为未通过,sex为性别)。

现在需要进行统计,每一个班级通过考试以及没有通过考试的人数。

方法一:使用OR NULL

mysql> select count(pass=1 or null) as pass,count(pass=0 or null) as no_pass,class from count_demo group by class;
+------+---------+-------+
| pass | no_pass | class |
+------+---------+-------+
|    1 |       1 |     1 |
|    2 |       1 |     2 |
|    1 |       0 |     3 |
|    0 |       1 |     4 |
|    1 |       0 |     5 |
|    0 |       1 |     6 |
+------+---------+-------+
6 rows in set

其中需要注意的是“or null”的使用,手册中提到 COUNT(column_name) 函数返回指定列的值的数目(NULL 不计入),那么如果pass不等于1的时候,or null就起作用,让条件为null,那么count就不会计算pass不为1的值。也即是正确的统计结果。(可自行去掉or null测试一下,得到的结果是错误的)


方法二:使用多条select

mysql> select count(pass) as pass,class from count_demo where pass=1 group by class;
+------+-------+
| pass | class |
+------+-------+
|    1 |     1 |
|    2 |     2 |
|    1 |     3 |
|    1 |     5 |
+------+-------+
4 rows in set
mysql> select count(pass) as pass,class from count_demo where pass=0 group by class;
+------+-------+
| pass | class |
+------+-------+
|    1 |     1 |
|    1 |     2 |
|    1 |     4 |
|    1 |     6 |
+------+-------+
4 rows in set

这样很直观也很简单,如果统计条件少,建议使用。

方法三:使用CASE WHEN

mysql> select count(case when pass=1 then 1 else null end)as pass,count(case when pass=0 then 1 else null end)as no_pass,class 
from count_demo group by class;


+------+---------+-------+
| pass | no_pass | class |
+------+---------+-------+
|    1 |       1 |     1 |
|    2 |       1 |     2 |
|    1 |       0 |     3 |
|    0 |       1 |     4 |
|    1 |       0 |     5 |
|    0 |       1 |     6 |
+------+---------+-------+
6 rows in set

CASE WHEN语句的功能很强大,可以定义灵活的查询条件,很适合进行分类统计。

原文地址:https://www.cnblogs.com/RyanJin/p/11731694.html