返回GROUP BY子句中的空行

时间:2014-01-11 14:59:06

标签: mysql sql database data-warehouse

我有一个查询来检索两个日期之间每天的事件总数。

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

3 个答案:

答案 0 :(得分:0)

SO上有很多解决方案:

One solution是另一张包含所有可能/相关日期的表格。可以在此处找到一个实现:https://stackoverflow.com/a/7262803/1085891

  

这通常通过具有日期维度在数据仓库中完成   有一个所有可能日期的列表。你做了一个OUTER JOIN   日期维度和COALESCE将空值设为0。

如果经常运行,存储日期会更有效。但是,对于快速报告,您可以生成所需的日期,并将输出加入到您要搜索的表中。

答案 1 :(得分: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;

答案 2 :(得分: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;