我需要一种生成报告的方法,该报告显示每小时的交易(或点击)数量。到目前为止,我已经设法得到如下表格,但它没有数据就跳过了几个小时。
即使计数为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`)
答案 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;
还有其他方法可以生成小时列表。子查询是最通用的。