【发布时间】:2018-02-19 13:51:58
【问题描述】:
情况(简体):
tableA
id | date | val
------------------------------
0 2018-02-19 00:01:00 | 10
1 2018-02-19 00:02:00 | 10
2 2018-02-19 00:03:00 | 10
.. 2018-02-19 23:59:00 | 10
我需要做一个查询,每小时返回列 val 的总和。
这是查询
SELECT `AllHours`.`hour` , COALESCE(SUM(`A`.`val`),0) AS `A`.`total`
FROM `tableA` AS `A`
RIGHT JOIN (
SELECT 0 AS `hour`
UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3
UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6
UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9
UNION ALL SELECT 10 UNION ALL SELECT 11 UNION ALL SELECT 12
UNION ALL SELECT 13 UNION ALL SELECT 14 UNION ALL SELECT 15
UNION ALL SELECT 16 UNION ALL SELECT 17 UNION ALL SELECT 18
UNION ALL SELECT 19 UNION ALL SELECT 20 UNION ALL SELECT 21
UNION ALL SELECT 22 UNION ALL SELECT 23
) AS `AllHours` ON HOUR(`A`.`date`) = `AllHours`.`hour`
WHERE `A`.`date` BETWEEN '2018-02-19 00:00:00' AND '2018-02-19 23:59:59' OR `A`.`date` IS NULL
GROUP BY `AllHours`.`hour`
ORDER BY `AllHours`.`hour`
结果
查询有效,但缺少第 11 小时。
重要提示 我需要所有的时间,如果没有数据的话。否则我不会添加 RIGHT JOIN 并且按小时(日期)分组就足够了。
【问题讨论】:
-
认真考虑处理应用代码中数据显示的问题。
-
ptot列在哪里出现在您的查询中但未出现在您的数据中? -
@TimBiegeleisen 问题已更新..
-
你能解释一下这个
IF表达式在做什么:IF(hour < 10 , '0' , '')吗?顺便说一句,您按小时分组(明智的),同时选择不同的东西。 AFAIK 第 11 个小时不应该消失,因为你的日历表应该把它带进来。 -
您需要使其可重现。考虑在此站点上设置演示:rextester.com