我想获取过去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)。
答案 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";