【问题标题】:Selecting count of zero while grouping by column按列分组时选择零计数
【发布时间】:2010-09-29 18:27:25
【问题描述】:

我有一个工作表,并且正在尝试获取不同时间范围内的工作计数。我当前的查询如下所示:

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)

要更改我的时间范围,我只需将 GROUP BYWEEK 更改为 MONTH,然后按月而不是按周计算。

问题是,我在数周内没有得到空行,但有 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 周没有数据,这应该是具有 count(0) 的行。有什么方法可以让计数为 0 的行,同时保持在WEEKMONTH 之间更改分组的灵活性?

【问题讨论】:

    标签: mysql database count group-by


    【解决方案1】:

    创建一个包含每个日期和外部连接的辅助日历表(如果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)
    

    【讨论】:

    • 我们没有包含此类数据的日历表,创建一个需要对应用程序的数据结构进行重大更改,而我没有时间实施。如果我将你所有的c.date 更改为c.created_at,并使用jobs 而不是calendar,它将返回与我的原始查询相同的数据集。
    • 您需要先创建辅助日历表。
    • 查看我上面的修改评论。这将需要对提供这些数据的 Rails 应用程序进行大量更改,而我没有时间实施这些更改。
    • 好吧,SQL 中没有任何内容可以帮助您添加缺失的行(如果它们不在数据中)。
    • 我可能误解了你的回答。您的日历表记录了每一天,而不仅仅是创建工作的日期,对吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-07
    • 1970-01-01
    • 2015-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多