2014-01-11 2 views
2

У меня есть запрос на получение общего количества событий в день между двумя датами.Возвращение пустых строк в предложение GROUP BY

SELECT 
    DATE_FORMAT(startTime, '%Y%m%d') as day, 
    COUNT(0) as numEvents 
FROM events 
WHERE 
    (startTime BETWEEN 20140105000000 AND 20140112235900) 
GROUP BY 
    day; 

Это возвращает список как

day  | numEvents 
---------+---------- 
20140105 | 45 
20140107 | 79 
20140108 | 12 
20140109 | 56 

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

day  | numEvents 
---------+---------- 
20140105 | 45 
20140106 | 0 
20140107 | 79 
20140108 | 12 
20140109 | 56 
20140110 | 0 
20140111 | 0 
20140112 | 0 
+0

Несколько решений здесь: http://stackoverflow.com/questions/6310839/sql-group-by-including-empty -rows – JSuar

ответ

0

Есть довольно много решений на SO:

One solution - это еще одна таблица, которая содержит все возможные/актуальные даты. Одна из реализаций можно найти здесь: https://stackoverflow.com/a/7262803/1085891

Это обычно делается в хранилищах данных, имея дату измерения , который имеет список всех возможных дат. Вы делаете OUTER JOIN к дате измерению и COALESCE нулевых значений 0.

Если запустить часто, было бы более эффективно хранить даты. Тем не менее, для быстрого отчета вы можете создать нужные даты и присоединиться к выходу в таблицу, которую вы ищете.

0

Попробуйте

SELECT DATE_FORMAT(startTime, '%Y%m%d') as day, COUNT(DATE_FORMAT(startTime, '%Y%m%d')) 
FROM events 
WHERE 
(startTime BETWEEN 20140105000000 AND 20140112235900) 
GROUP BY day; 
0

Вы будете в состоянии сделать это, если startTime является foreign_key к другой таблице, которые имеют значения для каждой даты , Это типично для многомерных моделей хранилищ данных, где у вас есть измерение даты/времени, и они включают все дни.

В этом случае, я считаю, что решение, предоставляемое Vigens Kumar будет работать:

SELECT DATE_FORMAT(startTime, '%Y%m%d') as day, COUNT(DATE_FORMAT(startTime, '%Y%m%d')) 
FROM events 
WHERE 
(startTime BETWEEN 20140105000000 AND 20140112235900) 
GROUP BY day; 
Смежные вопросы