Zählen Sie null und nicht null Werte in einer Spalte

10

Wie kann man in MySQL null und nicht null in derselben Spalte zählen und abrufen?

mein Tisch

---------------------------------------------------
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 |
---------------------------------------------------

Erwartetes Ergebnis

month      register    visited    not visited
---------------------------------------------
05-2014       2           1          1   
---------------------------------------------
04-2014       5           2          3
---------------------------------------------
Santhosh
quelle

Antworten:

6

Versuchen

SELECT 
   DATE_FORMAT(registDate, '%m-%Y') AS month,
   COUNT(name) AS register,
   SUM(!ISNULL(visited)) AS visited,
   SUM(ISNULL(visited)) AS not_visited
FROM mytable
GROUP BY DATE_FORMAT(registDate, '%m-%Y');

Sie müssen keine weitere Spalte erstellen.

Rodrigo Prazim
quelle
2

Als erstes müssen Sie eine Spalte für den Monat hinzufügen:

select *, date_format(registDate, '%Y-%m') as regist_month
from mytable

Dann können Sie alle Zählungen erhalten:

select
  regist_month
, count(registDate) as count_registered
, sum(case when visited is not null then 1 else 0 end) as count_visited
, sum(case when visited is null then 1 else 0 end) as count_not_visited
from (
  select *, date_format(registDate, '%Y-%m') as regist_month
  from mytable
) group by regist_month
Yawar
quelle
Sie können count anstelle von sum verwenden und den Ausdruck etwas kürzen : count(visited). count (<column>) zählt nur nicht null. Wenn Sie eine weitere Verschachtelungsebene hinzufügen, kann count_not_visited alscount_registered - count_visited
Lennart
1

Um beispielsweise alle Nicht-Null-Werte für eine Spalte zu zählen, col1können Sie nur verwenden count(col1) as cnt_col1. Um jedoch offensichtlicher zu sein, können Sie die sum()Funktion und den IS NOT NULLOperator verwenden, um zu werden sum(col1 IS NOT NULL). Dies liegt daran, dass der IS NOT NULLOperator ein int: 1 für true und 0 für false zurückgibt.

Um Nullwerte zu zählen, können Sie den IS NULLOperator verwenden, der 1 zurückgibt, wenn der Wert Null ist. Wie zuvor mit dem sum()Bediener.

In Anbetracht dessen, dass Sie Folgendes tun können, um sich für jeden Monat registrieren, besuchen und nicht besuchen zu lassen:

SELECT
date_format(registDate, '%m-%Y') as month,
count(registDate) as register,
sum(visited is not null) as visited,
sum(visited is null) as 'not visited'
GROUP BY
date_format(registDate, '%m-%Y')

Beachten Sie, dass Sie die Spalte "Nicht besucht" mit dem Leerzeichen ausgeben können, indem Sie einfach zitieren, doppelt zitieren oder Backticks (`) verwenden.

Ein anderer Ansatz zur Auswahl und Gruppierung nach Monat wäre die Verkettung von Monat und Jahr wie folgt concat(month(registDate), '-', date(registDate)). Aber es ist weniger elegant.

Der casein anderen Antworten vorgeschlagene Operator ist vollkommen gültig, aber ich denke, dass er für andere Situationen angemessener ist. Und es ist ausführlicher.

Nuno Pereira
quelle