我可以获得每小时计数,包括没有数据的小时数吗?

时间:2016-01-17 17:03:00

标签: mysql

我需要一种生成报告的方法,该报告显示每小时的交易(或点击)数量。到目前为止,我已经设法得到如下表格,但它没有数据就跳过了几个小时。

即使计数为0,有没有办法显示小时?

SELECT HOUR(`time`), Count(*)
FROM `taps`
WHERE DATE(`time`) = '2016-01-17' AND `readerid` IN 
            (SELECT `readerid` 
             FROM `readers` 
             WHERE `type` = 'A')
GROUP BY HOUR(`time`)
ORDER BY HOUR(`time`)

这将产生下表:
enter image description here

2 个答案:

答案 0 :(得分:0)

是的,你可以。

通过将LEFT OUTER JOIN或RIGHT OUTER JOIN用于同一个表并对其进行别名,您可以选择NULL值,甚至根据查询中声明的条件为它们提供值。

请显示您的预期结果,以便提供语法示例。 并提供您正在使用的表格,我试图复制,但没有找到建立陷阱和读者之间关系的方法。

答案 1 :(得分:0)

假设您有所有小时的部分数据,那么您可以将查询标记为带有条件聚合的left join

SELECT HOUR(t.`time`), Count(r.readerid)
FROM tabs t left join
     readers r
     on r.readerid = t.readerid and r.type = 'A'
WHERE DATE(t.time) = '2016-01-17'
GROUP BY HOUR(t.time)
ORDER BY HOUR(t.time);

如果不是这样,那么你需要一个小时列表,不知何故。一种方法是子查询:

SELECT h.hr, Count(r.readerid)
FROM (select 0 as hr union all select 1 union all . . .
      select 23
     ) h left join
     tabs t
     on h.hr = hour(t.time) and
        DATE(t.time) = '2016-01-17' left join
     readers r
     on r.readerid = t.readerid and r.type = 'A'
GROUP BY h.hr
ORDER BY h.hr;

还有其他方法可以生成小时列表。子查询是最通用的。