列のnull値と非null値をカウントする


10

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

回答:


6

試す

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

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


2

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

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

合計の代わりにカウントを使用して、式を少し短くすることができます:count(visited)。count(<column>)はnullではなくカウントのみを行います。あなたがcount_not_visitedネストの別のレベルを追加した場合のように決定することができますcount_registered - count_visited
レナート

1

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

null値をカウントIS NULLするには、値がnullの場合に1を返す演算子を使用できます。以前と同様に、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他の回答で提案された事業者は、完全に有効ですが、私は他の状況のために、それはより適切なと思います。そして、それはより冗長です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.