MySQLの同じ列でnullおよびnot nullをカウントして取得する方法は?
---------------------------------------------------
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
---------------------------------------------
やってみる
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');
別の列を作成する必要はありません。
最初にすることは、月の列を「追加」することです。
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
列のすべての非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
演算子は完全に有効ですが、他の状況ではより適切だと思います。そして、それはより冗長です。