2010-01-25 97 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