Выбор количества ноль при группировании по столбцу - PullRequest
3 голосов
/ 29 сентября 2010

У меня есть таблица заданий, и я пытаюсь получить количество заданий для разных временных периодов.Мой текущий запрос выглядит так:

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 BY с WEEK на 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-ю неделю, которая должна быть строкой с количеством (0).Есть ли способ получить эту строку отсчета 0, сохраняя при этом гибкость в изменении моей группировки между WEEK и MONTH?

1 Ответ

3 голосов
/ 29 сентября 2010

Создайте вспомогательную календарную таблицу, содержащую каждую дату и внешнее объединение с ней (ниже может потребоваться настройка, если 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)
...