2010-01-25 79 views
3
SELECT AVG(data) AS data, dateReg 
FROM table 
GROUP BY YEAR(dateReg), MONTH(dateReg), DAY(dateReg) ORDER BY dateReg 

上述数据的日期返回返回零为不存在MYSQL GROUP BY

1.75, 21 Jan 2010 
9.45, 22 Jan 2010 
3.96, 23 Jan 2010 
2.68, 30 Jan 2010 

其失踪日期从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 

回答

5

您通常通过加入值表来实现这种类型的事情,即包含所有v您感兴趣的线索。

典型值表格可能包含例如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 

上面的查询可能需要一些调整来获得的值为零,而不是空的,但重点是值表通常是为缺失数据点提供输出记录的最简单方法。
另一种方法是使用一个函数/表达式在子查询中产生期望的[日期]序列,但这通常效率较低且容易出错。

+0

周六好好的5分钟试图说出我的回应,他需要一个带有日期值的单独表格加入 - 你的回复钉上了它:) – suitedupgeek 2010-01-25 23:45:20

+0

我需要加入右边的表格,其中包含所有日期,没有生成该表的方法吗? – 2010-01-26 00:38:27

+0

我可以不生成使用查询 – 2010-01-26 00:41:24