web-dev-qa-db-ja.com

列のnull値とnullでない値をカウントする

MySQLの同じ列でnullおよびnot nullをカウントして取得する方法は?

mytable

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

期待される結果

month      register    visited    not visited
---------------------------------------------
05-2014       2           1          1   
---------------------------------------------
04-2014       5           2          3
---------------------------------------------
10
santhosh

やってみる

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');

別の列を作成する必要はありません。

6
Rodrigo Prazim

最初にすることは、月の列を「追加」することです。

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

次に、すべてのカウントを取得できます。

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

列のすべての非null値をカウントするには、たとえば_col1_とすると、count(col1) as cnt_col1を使用できます。しかし、より明確にするために、sum()関数と_IS NOT NULL_演算子を使用して、sum(col1 IS NOT NULL)にすることができます。これは、_IS NOT NULL_演算子がintを返すためです。trueの場合は1、falseの場合は0です。

Null値をカウントするには、値がnullの場合に1を返す_IS NULL_演算子を使用できます。以前と同様に、sum()演算子を使用します。

それを考えると、毎月の登録済み、訪問済み、非訪問を取得するために、これはあなたができることです:

_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')
_

引用符、二重引用符、またはバッククォート( `)を使用するだけで、「未訪問」列にスペースを出力できることに注意してください。

月ごとに選択してグループ化する別のアプローチは、このconcat(month(registDate), '-', date(registDate))のように、月を年と連結することです。しかし、それはエレガントではありません。

他の応答で提案されたcase演算子は完全に有効ですが、他の状況ではより適切だと思います。そして、それはより冗長です。

1
Nuno Pereira