2014-01-11 81 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到 日期維度和聚結空值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;