2010-09-29 28 views
3

我有一個作業表,並且正試圖獲得不同時間範圍內作業的計數。我當前的查詢看起來是這樣的:在按列分組時選擇零計數

SELECT COUNT(*) AS 'count', 
     WEEK(j.created_at) AS 'week', 
     MONTH(j.created_at) AS 'month', 
     YEAR(j.created_at) AS 'year', 
     DATE_FORMAT(j.created_at, '%y') AS 'short_year' 
FROM jobs j WHERE j.state <> 'draft' 
      AND created_at > '2010-06-21' 
      AND created_at < '2010-08-01' 
GROUP BY WEEK(j.created_at) 
ORDER BY WEEK(j.created_at) 

要改變我的時間表,我簡單地改變從WEEKGROUP BYMONTH,我按月而不是每週得到計數。

問題是,我沒有獲得0個工作周的空行。我的結果從上面的查詢設置爲:

count week month year short_year 
    3 25  6 2010   10 
    2 26  6 2010   10 
    2 27  7 2010   10 
    1 28  7 2010   10 
    3 30  7 2010   10 

你會發現,沒有數據的第29周,這應該是與計數行(0)。有沒有辦法獲得0計數行,同時保持在WEEKMONTH之間更改我的分組的靈活性?

回答

3

創建一個包含所有的日期和外輔助日曆表連接到該(以下可能需要調整,如果created_at有時間部分)

SELECT COUNT(*) AS 'count', 
     WEEK(c.date) AS 'week', 
     MONTH(c.date) AS 'month', 
     YEAR(c.date) AS 'year', 
     DATE_FORMAT(c.date, '%y') AS 'short_year' 
FROM calendar c 
LEFT OUTER JOIN jobs j ON j.created_at = c.date 
      AND j.state <> 'draft' 
WHERE c.date > '2010-06-21' 
      AND c.date < '2010-08-01' 
GROUP BY WEEK(c.date) 
ORDER BY WEEK(c.date) 
+0

我們沒有與這樣的數據日曆表,創建一個需要對應用程序的數據結構進行重大更改,而我沒有時間實施。如果我將所有'c.date'更改爲'c.created_at',並且使用'jobs'而不是'calendar',它將返回與我原始查詢相同的數據集。 – 2010-09-29 18:36:44

+0

您需要**首先創建**輔助日曆表。 – 2010-09-29 18:38:14

+0

看到我上面修改的評論。這將對Rails應用程序服務這些數據發生大量更改,並且我沒有時間來實現這些更改。 – 2010-09-29 18:38:53