为不存在MYSQL GROUP BY的日期返回Zeros

Ang*_*.47 3 mysql grouping

SELECT AVG(data) AS data, dateReg 
FROM table 
GROUP BY YEAR(dateReg), MONTH(dateReg), DAY(dateReg) ORDER BY dateReg
Run Code Online (Sandbox Code Playgroud)

以上数据返回

1.75, 21 Jan 2010
9.45, 22 Jan 2010
3.96, 23 Jan 2010
2.68, 30 Jan 2010
Run Code Online (Sandbox Code Playgroud)

它缺少日期从24日到29日,我们可以这样做,所以返回值是:

1.75, 21 Jan 2010
9.45, 22 Jan 2010
3.96, 23 Jan 2010
0, 24 Jan 2010
0, 25 Jan 2010
0, 26 Jan 2010
0, 27 Jan 2010
0, 28 Jan 2010
0, 28 Jan 2010
2.68, 30 Jan 2010
Run Code Online (Sandbox Code Playgroud)

mjv*_*mjv 5

您通常通过使用值表连接来实现此类事物,即包含您感兴趣的所有值的表.

典型值表可以包含例如0到1,000之间的所有整数值,或者给定时段的所有日期.通常,Value表包含的值多于所需的值,我们通过在WHERE子句中添加过滤器来获得所需的确切输出.

在这种情况下,您将需要一个包含日期的表格.假设此表名为ValTableDates,并且它包含2005年1月到2010年12月之间的所有日期,则查询将如下所示:

SELECT AVG(data) AS data, VT.ValDate
FROM ValTableDates VT
LEFT JOIN  table T ON T.dateReg = VT.ValDate
WHERE VT.ValDate > [Some Start Date] and VT < [Some End Date]
GROUP BY YEAR(dateReg), MONTH(dateReg), DAY(dateReg) 
ORDER BY dateReg
Run Code Online (Sandbox Code Playgroud)

上面的查询可能需要稍微调整才能得到零值而不是NULL,但重点是值表通常是为丢失数据点提供输出记录的最简单方法.
另一种方法是使用在子查询中生成所需[日期]序列的函数/表达式,但这通常效率较低且更容易出错.