2016-09-15 3 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 в течение последних 12 месяцев в control_number.

В основном это COUNT, где control_number = 1, но по месяцам.

Так что если запрос сделан сегодня, его сентябрь, он должен начинаться с сентября по октябрь 2015 года и отображать количество записей за каждый месяц.

Результат должен быть:

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

это значение datetime –

ответ

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; 

Если вы не имеете по крайней мере одну запись для каждого месяца, тогда вы Мне понадобится 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

Try:

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)); 
Смежные вопросы