2010-09-29 3 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) 

Чтобы изменить временные рамки, я просто изменить 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 count, сохраняя при этом гибкость изменения моей группировки между WEEK и MONTH?

ответ

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', он возвращает тот же набор данных, что и мой исходный запрос. –

+0

Сначала необходимо создать ** вспомогательную таблицу календаря. –

+0

См. Мой измененный комментарий выше. Это потребует значительных изменений в приложении Rails, обслуживающих эти данные, и у меня нет времени для реализации этих изменений. –

Смежные вопросы