我有这个查询,我想用一些值填充缺少的日期(例如零......)
SELECT date, SUM(val1) as sum_val
FROM table1
WHERE date BETWEEN '2016-03-04' AND '2016-03-10'
GROUP BY date
结果如下:
|--------------------------
|date, sum_val
|--------------------------
|2016-03-04, 21568
|--------------------------
|2016-03-05, 14789
|--------------------------
|2016-03-08, 20568
|--------------------------
|2016-03-10, 5841
|--------------------------
如何使用零值填充缺少的日期?有没有人有想法?
我需要图表预览的这些数据。
答案 0 :(得分:4)
你可以尝试这个PHP循环:
$date1 = Your_first_date_value;
$date2 = Your_limit_date;
for ($d1 = $date1; d1<=$date2; strtotime("+1 day", strtotime($d1))) {
//Fill in values
}
strtotime("+1 day", strtotime($date1))
会将$date1
的当前值增加1天,直至等于$date2
。
当一个日期没有值时,它将为零,如果日期存在,它将根据MySQL结果得到总和。
答案 1 :(得分:1)
通常,您可以使用以下命令在MySQL中生成一系列N个整数:
select (@i:=@i+1)-1 as `myval` from someTable,(SELECT @i:=0) gen_sub limit N
请注意,您加入的表格(someTable)必须至少包含N行。上面的-1是使其为零 - 删除它并且您已经N = 3得到1,2,3。
您可以将这些整数提供给DATE_ADD函数,将其转换为一系列日期。为了便于理解,请在日期中使用一些用户变量。
SET @date_min = '2016-03-04';
SET @date_max = '2016-03-10';
select DATE_ADD(@date_min, INTERVAL (@i:=@i+1)-1 DAY) as `date`
from information_schema.columns,(SELECT @i:=0) gen_sub
where DATE_ADD(@date_min,INTERVAL @i DAY) BETWEEN @date_min AND @date_max
这将返回那些日子和他们之间每天的行。现在只是加入你的桌子的问题......我没有尝试过,因为我没有你的数据库结构,但下面的内容应该有效:
SET @date_min = '2016-03-04';
SET @date_max = '2016-03-10';
SELECT
date_generator.date,
ifnull(SUM(val1),0) as sum_val
from (
select DATE_ADD(@date_min, INTERVAL (@i:=@i+1)-1 DAY) as `date`
from information_schema.columns,(SELECT @i:=0) gen_sub
where DATE_ADD(@date_min,INTERVAL @i DAY) BETWEEN @date_min AND @date_max
) date_generator
left join table1 on table1.date = date_generator.date
GROUP BY date;
答案 2 :(得分:0)
使用下面与您的查询类似的代码,确实可以帮助您。
$query = "SELECT date, SUM(val1) as sum_val
FROM table1
WHERE date BETWEEN '2016-03-04' AND '2016-03-10'
GROUP BY date";
$result = mysql_db_query($db,$query);
$dateArray = Array();
foreach($result as $row)
{
$dateArray[] = strtotime($row['date']);
}
$from = "1-4-2016";
$to = "30-4-2016";
$datediff = strtotime($from) - strtotime($to);
$days = floor($datediff/(60*60*24));
for ($d1 = 1; $d1<$days; $d1++) {
$cdate = strtotime("+".$d1." day", strtotime($from));
if(!in_array($cdate, $dateArray))
{
// Insert record with zero
}
}