2017-06-28 5 views
1

期間内に受注の数をカウントしようとしています。しかし、私はそれがゼロMysqlカウント時にゼロ値を取得する

私のテーブル

+---------------+------------+------------------+ 
| metrausername | signupdate | cancellationdate | 
+---------------+------------+------------------+ 
| GLO00026  | 2017-06-22 | 2017-03-20  | 
| GLO00055  | 2017-06-22 | 2017-04-18  | 
| GLO00022  | 2017-06-27 | NULL    | 
| GLO00044  | 2017-06-24 | NULL    | 
| GLO00005  | 2017-06-26 | NULL    | 
+---------------+------------+------------------+ 

私がもしあれば、私に教えてください

SELECT metrausername, COUNT(*) AS count FROM salesdata2 
WHERE cancellationdate IS NOT NULL 
AND signupDate >= '2017-6-21' AND signupDate <= '2017-7-20' 
GROUP BY metrausername; 

とカウントするようにしようとしているなステートメントです結果を返さないという問題に遭遇します追加情報が役立つ

+0

'signupDate'のデータ型は何ですか? – Jens

+0

@Jens date、cancellationdateも日付です – user3027185

+0

あなたは予想されるデータを表示できますか?あなたの例では、行進のサインアップのみが表示されます – Jens

答えて

1

metrausernameがwhereで除外されている場合は表示されません。左は、このラウンドを取得するための集約に参加する:

select distinct a1.metrausername, coalesce(a2.counted,0) as counted -- coalesce replaces null with a value 
from salesdata2 a1 
left join 
(
SELECT metrausername, COUNT(*) AS counted 
FROM salesdata2 
WHERE cancellationdate IS NOT NULL 
AND signupDate >= '2017-6-21' AND signupDate <= '2017-7-20' 
GROUP BY metrausername 
) a2 
on a1.metrausername = a2.metrausername 
+0

NULLの代わりに0を返す方法はありますか? – user3027185

+1

@ user3027185はい、編集を参照してください – JohnHC

+0

ここにはたくさんのクエリがあります。 – Strawberry

1

私はちょうどselectにフィルタリング句を移動することでこれを行うだろう。あなたは本当に、その後、(範囲外のユーザーを有するのとは対照的に)日付範囲をしたいですかと仮定:

SELECT metrausername, COUNT(cancellationdate) AS count 
FROM salesdata2 
WHERE signupDate >= '2017-06-21' AND signupDate <= '2017-07-20' 
GROUP BY metrausername; 

COUNT(<colname>)は、非NULL値をカウントし、これが最も簡単な方法のように思えます。

+0

これは、OPが0 – JohnHC

+0

@ JohnHCとして返すように要求したsignupdate範囲内に存在しない 'metrausername'を返しません。 。 。私は説明が混乱しているのを見つけました。私はOPが単に日付の範囲にあるNULL値を参照していると思っていました。 –

関連する問題