2013-03-04 167 views
1

我想要得到的結果顯示,X具有條目SQL返回日期

SELECT count(*), 
     date_column 
FROM myTable 
WHERE X 
GROUP BY date_column 
ORDER BY date_column DESC 

這工作的日期表,但我也想看看日期,其中X沒有條目,在我的使用情況下,這將是中間日期。

因此,例如2013-3-10將在結果中,但下一個日期將是2013-3-5,但我需要我的結果還返回count = 0的日子,所以在這種情況下,第六,第七,第八和第九

我將如何格式化我的查詢,以包括那些額外的時間?

+1

什麼分貝?您必須使用生成的日期表離開加入。 PG例如有generate_series這個,但其他數據庫可能需要其他的黑客。 – 2013-03-04 21:29:49

+1

SQL不創建數據。因此,您必須擁有所有可能日期的來源並將它們加入進來,或者當您要顯示結果以使NULL日期爲0時,您只需構建它。此技術可以回溯到存儲昂貴的日子,所以你沒有存儲0數據。沒有數據就足夠了,如果需要的話,你讓顯示工具顯示0。 – xQbert 2013-03-04 21:31:01

+0

@xQbert權利我正在使用ORM,可以檢索數據作爲數組,我可以在那裏操縱它。想知道是否有辦法做到這一點在查詢 – CQM 2013-03-04 21:36:09

回答

3

我嘲笑了一個簡單的例子:

SELECT q.date_column, count(f.id) FROM 
(SELECT 
generate_series(min(date_column),max(date_column), '1 day') AS date_column 
FROM mytable) AS q 
LEFT JOIN mytable AS f 
ON q.date_column=f.date_column 
GROUP BY q.date_column ORDER BY q.date_column; 

這產生在所需的範圍內的所有日期。確保不要做COUNT(*),或者你會得到1而不是0 http://sqlfiddle.com/#!1/fd4ff/1

+0

哇這是一個功能強大的postgresql函數。 – xQbert 2013-03-04 22:11:39

+0

@xQbert它當然很好,因爲如果你的施主桌足夠大,你不必擔心。但是對於MSSQL和Oracle(以及PostgreSQL)的窗口函數和MySQL的變量也可以做到這一點。您只需從表格中選擇row_number(或者與其自身交叉連接的表格足夠多的時間,以便爲您提供所需的數字類型)並添加到日期。 – 2013-03-04 22:51:30

+0

hmmmm,f.id在每個日期總是返回0 – CQM 2013-03-04 23:20:05

1

PostgreSQL的以下作品:

SELECT count(*) as count, datecolumn as date FROM myTable group by datecolumn UNION 
select 0 as count, i::date as date from generate_series('2013-01-01', 
'2013-12-31', '1 day'::interval) i where i not in (select datecolumn from myTable) order by date desc