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

  • 相关阅读:
    Repository中进行模糊查询
    Spring jpa添加查询条件
    java后端repository层中进行模糊查询
    MyBatis小白问题 1、Invalid bound statement (not found): com.itheima.dao.UserDao.findAll,2、Resources.getResourceAsStream()报错
    Date类型做加减运算
    时间格式转换
    mysql-支持的数据类型
    mysql—表的完整性约束
    数据库—表操作(第二章)
    mysql—使用python操作mysql数据库(第五章)
  • 原文地址:https://www.cnblogs.com/RyanJin/p/11731694.html
Copyright © 2011-2022 走看看