2014-04-19 2 views
2

У меня есть следующий запросГруппа по месяцам или 0, если не результаты?

SELECT MONTH(date_added), COUNT(*) 
FROM invite 
WHERE YEAR(date_added) = 2013 
GROUP BY MONTH(date_added) 

И это отлично работает, но моя проблема, если нет результатов в течение месяца не выход месяц, мне нужно сказать 0 вместо этого.

Я не хочу создавать таблицу со всеми 12-месячными значениями. И я не хочу запускать 12 запросов, есть ли другой способ сделать это?

ответ

2

Вам не нужно «создавать таблицу с 12-месячными значениями». Вы можете просто сделать это в запросе:

SELECT m.mon, COUNT(i.date_added) 
FROM (select 1 as mon union all select 2 union all select 3 union all select 4 union all 
     select 5 union all select 6 union all select 7 union all select 8 union all 
     select 9 union all select 10 union all select 11 union all select 12 
    ) m left outer join 
    invite i 
    on m.mon = i.month(date_added) and year(date_added) = 2013 
GROUP BY m.mon; 
+0

Это, кажется, не работает для меня. – Steven

+0

@Steven. , , Я отбросил изменения по двум причинам. Во-первых, 'coalesce()' не требуется с 'count ()'. 'Count()' вернет '0', а не' NULL'. Во-вторых, создание подзапроса добавляет дополнительные накладные расходы в MySQL, поэтому лучше делать логику в предложении 'on'. Проблема заключалась в том, что предложение 'where', которое я удалил. –

0

Вот сырный способ сделать это:

create table months (int monthnum); 

Вставьте цифры от 1 до 12 в месяцы, так что это просто таблица с 1 колонкой и 12 строк.

select monthnum, coalesce(ct, 0) from months left join (
    select month(date_added) Mon, count(*) ct from invite 
    where year(date_added)=2013 group by Mon) 
    on monthnum = Mon 

Coalesce дает вам нуль вместо нуля, если месяц отсутствует.

Смежные вопросы