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

  • 相关阅读:
    TensorFlow-Slim 简介+Demo
    AI 常见术语总结
    经典深度学习CNN总结
    YOLO V3 原理
    tf.app.run() 运行结束时,报错:SystemExit exception: no description
    VSCode中相对路径设置问题
    SSD算法原理
    机器学习-交叉熵原理
    tensorflow scope的作用
    水池进水和出水两个线程问题
  • 原文地址:https://www.cnblogs.com/RyanJin/p/11731694.html
Copyright © 2011-2022 走看看