2010-06-04 92 views
2

因此,我有一張表,用於收集我所做的工作的數據。每次我創建一份工作時,我都會給它分配一個日期。這個問題是我沒有工作的日子沒有存儲在數據庫中,因此當我繪製數據時,我從來沒有看到我沒有工作的日子。通過MySQL從數據庫中檢索缺失的日期

我當前的查詢看起來是這樣的:

SELECT job_data_date, SUM(job_data_invoice_amount) as job_data_date_income 
FROM job_data 
WHERE job_data_date >= '2010-05-05' 
GROUP BY job_data_date 
ORDER BY job_data_date; 

輸出是:

| job_data_date | job_data_date_income | 
| 2010-05-17  | 125      | 
| 2010-05-18  | 190      | 
| 2010-05-20  | 170      | 

正如你可以從輸出示例見​​將不會在結果中顯示出來,因爲這是從來沒有存儲在那裏。

有沒有辦法顯示缺失的日期?

謝謝

薩芬

+0

*可能的重複,至少與以下相關:* http://stackoverflow.com/questions/2501993/mysql-filling-in-missing-dates,http://stackoverflow.com/questions/2844486/mysql-to-填充缺少日期時使用組按日期表時間戳無,http://stackoverflow.com/questions/400759/sql-group-by-date-but-get-dates-wo-記錄 - 也 – 2010-06-04 22:14:30

回答

1

有沒有合理的方式做到這一點使用純SQL,MySQL的,至少,沒有用出有史以來每次約會創建表。您最好的選擇是改變使用該查詢結果的應用程序來填充空洞本身。而不是隻繪製它接收到的值,用一個簡單的循環構造它自己的一組值;一次計算一天,從查詢中填入任何可用的值。

+1

遞歸查詢意味着這樣的事情,但MySQL不支持WITH語法:( – 2010-06-04 22:21:12

2

一個想法是,你可以有一個表中的所有日期,你想要顯示,然後做一個與該表的外部聯接。

所以,如果你有一臺名爲alldates有一列(job_data_date):

SELECT ad.job_data_date, SUM(job_data_invoice_amount) as job_data_date_income 
FROM alldates ad left outer join job_data jd on ad.job_data_date = jd.job_data_date 
WHERE ad.job_data_date >= '2010-05-05' 
GROUP BY ad.job_data_date 
ORDER BY ad.job_data_date; 

不利的一面是,你需要保持這個表格填充了所有你想要顯示的日期。

+0

NUMBERS表更常見 - 只需使用DATE_ADD來根據起點獲取日期,但您是對的 - OP需要生成一個日期列表和LEFT JOIN。 – 2010-06-04 22:20:26