2010-09-29 26 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