2017-09-23 77 views
1

我有一個基本的SQL查詢:SQL技巧按月計算行數?

SELECT MONTH(created_at), COUNT(id) as total FROM `clients` GROUP BY MONTH(created_at) 

它返回我按月等作爲細分電子郵件數據:

MONTH(created_at) | total 
09     1 
10     2 

如何填寫剩下的幾個月爲零?所以,結果,我需要得到所有月份:

MONTH(created_at) | total 
09     1 
..     2 
12     5 

我試着這樣說:

SELECT months.id, COUNT(clients.id) as total FROM `months` LEFT JOIN `clients` ON MONTH(created_at) = months.id GROUP BY MONTH(created_at) 

回答

1

感謝所有的答案,尤其是亞歷克斯,這樣工作的:

SELECT months.id, COUNT(clients.id) as total FROM `months` LEFT JOIN `clients` ON months.id = MONTH(created_at) GROUP BY months.id; 
2

使用派生表的所有月份的數字和left join你到該表。

SELECT mths.mth, COUNT(c.id) as total 
FROM (select 1 as mth union select 2 union select 3 union 
     select 4 union select 5 union select 6 union select 7 union 
     select 8 union select 9 union select 10 union select 11 union select 12) mths 
LEFT JOIN `clients` c on mths.mth=month(c.created_at) 
GROUP BY mths.mth 
+0

它看起來可怕,性能如何呢? – OPV

+0

請看我的編輯 – OPV

2

最好的做法是擁有CALENDAR表,您可以從中查詢您需要的時間段,然後將數據留在連接表中。 或者您可以簡單地生成您需要的時段列表。如果你有一段時間,你可以使用派生表。在這種情況下最快的方法將是Excel生成列表。