2016-09-15 7 views
1

を書くためにどのように私は、このデータベースがあります。このクエリMYSQL

| id | name | email   | control_number | created | | | | |   | 
|:--:|-------|-----------------|----------------|------------|---|---|---|---|---| 
| 1 | john | [email protected] | 1    | 14/09/2016 | | | | | | 
| 2 | carl | [email protected] | 1    | 13/08/2016 | | | | | | 
| 3 | frank | [email protected] | 2    | 12/08/2016 | | | | | | 

を、私はcontrol_numberによって最後の12か月にCOUNTを取得したいです。

基本的には、control_number = 1で、月ごとのCOUNTです。

今日の9月のクエリでは、2015年9月9日から10月10日にかけて、毎月のレコード数が表示されます。

結果は次のようになります。

09/2016 = 50 
08/2016 = 35 
07/2016 = 20 
06/2016 = 50 
05/2016 = 21 
04/2016 = 33 
03/2016 = 60 
02/2016 = 36 
01/2016 = 11 
12/2015 = 0 
11/2015 = 0 
10/2015 = 0 
+0

あなたのテーブルであなたの 'created'列のデータ型とは何ですか? –

+0

日時の値は –

答えて

2

うーん。 0の値を取得するのは難しいことがあります。あなたは一部データの各月を持っていると仮定すると(たとえではないため、「1」)、あなたが行うことができますアン番目:

その後、
select extract(year_month from created) as yyyymm, 
     sum(control_number = 1) 
from t 
where created >= date_sub(curdate(), interval 12 month) 
group by extract(year_month from created) 
order by yyyymm; 

あなたは月ごとに少なくとも1つのレコードを持っていない場合は、」 left joinと1か月あたり1行のテーブルが必要です。

+0

ですか?私はちょうどそれを試して、他のテーブルで0を与える、 それは完璧に動作している! –

+0

はい、あなたは正しいです、私は "1"ではなく、常にデータを持っているデータを持っています。だからこれはいいです。ありがとう! –

0

はこれを試してみてください:

select CONCAT(SUBSTRING(ym, 5, 2), '/', SUBSTRING(ym, 1, 4)) Month, Count from ( 
    select EXTRACT(YEAR_MONTH FROM created) ym, count(*) Count 
    from mytable 
    where EXTRACT(YEAR_MONTH FROM created) > (EXTRACT(YEAR_MONTH FROM SUBDATE(NOW(), INTERVAL 1 YEAR)) 
    group by 1 
    order by 1 desc) x 
0

試してみてください。

select concat(month(created),'/',year(created)) as period, count(*) as cnt 
from mytable 
where control_number=1 and TIMESTAMPDIFF(year, created, now())=0 
group by (month(created));