Comment compter et récupérer null et non null sur la même colonne dans MySQL?
ma table
---------------------------------------------------
id | name | visited | registDate |
---------------------------------------------------
1 | george | NULL | 2014-04-01 |
---------------------------------------------------
2 | Thomas | NULL | 2014-04-15 |
---------------------------------------------------
3 | Wilfred | 1 | 2014-04-24 |
---------------------------------------------------
4 | paul | 1 | 2014-04-10 |
---------------------------------------------------
5 | elina | NULL | 2014-05-03 |
---------------------------------------------------
6 | angela | NULL | 2014-04-13 |
---------------------------------------------------
7 | elina | 1 | 2014-05-18 |
---------------------------------------------------
Résultat attendu
month register visited not visited
---------------------------------------------
05-2014 2 1 1
---------------------------------------------
04-2014 5 2 3
---------------------------------------------
count(visited)
. count (<column>) ne comptera que non nul. Si vous ajoutez un autre niveau d'imbrication, count_not_visited peut être déterminé comme suit:count_registered - count_visited
Par exemple, pour compter toutes les valeurs non nulles d'une colonne
col1
, vous pouvez simplement utilisercount(col1) as cnt_col1
. Mais, pour être plus évident, vous pouvez utiliser lasum()
fonction et l'IS NOT NULL
opérateur, devenantsum(col1 IS NOT NULL)
. C'est parce que l'IS NOT NULL
opérateur retourne un int: 1 pour vrai et 0 pour faux.Afin de compter les valeurs nulles, vous pouvez utiliser l'
IS NULL
opérateur, qui renvoie 1 lorsque la valeur est nulle. Comme avant, avec l'sum()
opérateur.Étant donné que, pour obtenir les inscrits, visités et non visités pour chaque mois, voici ce que vous pouvez faire:
Notez que vous pouvez afficher la colonne 'non visité' avec l'espace, simplement en citant, en double ou en utilisant des astuces (`).
Une autre approche pour sélectionner et regrouper par mois serait de concaténer le mois avec l'année, comme ceci
concat(month(registDate), '-', date(registDate))
. Mais c'est moins élégant.L'
case
opérateur proposé dans d'autres réponses est parfaitement valable, mais je pense qu'il est plus adéquat pour d'autres situations. Et c'est plus verbeux.la source