2014-04-19 40 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。 。 。我回滾了兩個原因。首先,'count()'不需要'coalesce()'。 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 

如果月份丟失,合併會給你一個零而不是null。