• 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语句的功能很强大,可以定义灵活的查询条件,很适合进行分类统计。

  • 相关阅读:
    Linux
    Linux下安装和使用FTp
    国内maven库镜像(阿里云)
    Java build path && Deployment assembly && 编译路径 && 发布路径
    关于Eclipse编译和执行文件时,后台默认执行动作的思考
    spring核心框架体系结构(各个jar包作用)
    OpenSessionInViewFilter的作用及原理
    Spring事务失效的原因
    解决Spring框架的Dao层改用@Repository注解,无法使用JdbcDaoSupport的问题
    JTA 深度历险
  • 原文地址:https://www.cnblogs.com/RyanJin/p/11731694.html
Copyright © 2020-2023  润新知