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

  • 相关阅读:
    HDU 3081 Marriage Match II
    HDU 4292 Food
    HDU 4322 Candy
    HDU 4183 Pahom on Water
    POJ 1966 Cable TV Network
    HDU 3605 Escape
    HDU 3338 Kakuro Extension
    HDU 3572 Task Schedule
    HDU 3998 Sequence
    Burning Midnight Oil
  • 原文地址:https://www.cnblogs.com/RyanJin/p/11731694.html
Copyright © 2011-2022 走看看