获取过去7天的数据,如果特定日期没有数据返回0

时间:2016-02-17 06:34:34

标签: java mysql sql

我想获取过去1周(7天)的数据,包括所有日期。当特定日期没有数据时,应返回零。

这是我到目前为止所拥有的

"SELECT DATE(date) AS created_date, SUM(quantity) AS total_amount " +
"FROM milk_collection " +
"WHERE DATE(date) > DATE_SUB(DATE(NOW()), INTERVAL 30 DAY) " +
"GROUP BY created_date";

问题是如果没有找到当天的记录,此查询不会返回零(0)。

3 个答案:

答案 0 :(得分:2)

这是" calendar table"的经典应用程序。要为某些键值获取零值,您需要确保这些键值显示在可以左连接到值表的表中。

创建一个每个日期包含一行的表:

create table calendar ( cal_date date );

然后使用您感兴趣的范围内的所有日期填充它。最后,在查询的日期列中将其加入milk_collection。这将保证您在所选范围内的每个日期至少有一行,quantity列中的空行没有数据。

答案 1 :(得分:0)

感谢@Jim Garrison的导游,我能够提出一个完全符合我要求的查询。希望这篇文章能帮助有类似问题的人节省时间。

SQL

"SELECT DATE(D) AS temporary_date, SUM(IFNULL(quantity,0)) AS total_amount, DATE(date) AS created_date "+ 
"FROM "+ 
   "( SELECT DATE_SUB(NOW(), INTERVAL D DAY) AS D "+ 
    " FROM (SELECT 0 as D "+ 
              "UNION SELECT 1 "+ 
              "UNION SELECT 2 "+ 
              "UNION SELECT 3 "+ 
              "UNION SELECT 4 "+ 
              "UNION SELECT 5 "+ 
              "UNION SELECT 6 ) AS D ) AS D "+ 
"LEFT JOIN milk_collection ON DATE(date) = date(D) "+ 
"GROUP BY temporary_date ORDER BY D ASC ";

答案 2 :(得分:-1)

试试这个,我不确定这是否有效,因为我没有安装MySQL的系统

"SELECT DATE(date) AS created_date, SUM(IFNULL(quantity,0)) AS total_amount " +
"FROM milk_collection " +
"WHERE DATE(date) > DATE_SUB(DATE(NOW()), INTERVAL 30 DAY) " +
"GROUP BY created_date";