2016-09-15 56 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 | | | | | | 

,我想獲得COUNT由control_number過去12個月。

基本上是一個COUNT,其中control_number = 1但按月份。

因此,如果查詢今天完成,其9月份應該從2015年9月開始到2015年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」),TH EN你可以這樣做:

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; 

如果沒有每月至少一個記錄,那麼」你需要一個left join和一個表每月一行。

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