2012-07-03 48 views
1

我有一個表'my_table'。它具有以下數據:SQL查詢在表中不存在的日期返回nil

ID --- Date   

1 --- 01/30/2012 
2 --- 01/30/2012 
3 --- 05/30/2012 

我可以寫一個SQL查詢返回特定日期之間的ID的數量,按月份進行分組,這樣的:

{"01/30/2012" => 2, "05/30/2012" => 1} 

我怎樣才能得到一個結果是具有值爲'0'的所需日期之間的所有缺失月份,如下所示:

{"01/30/2012" => 2, "02/30/2012" => 0, "03/30/2012" => 0, "04/30/2012" => 0, "05/30/2012" => 1} 

在此先感謝。

+1

你有任何可能的日曆表嗎?如果沒有,我建議爲此創建一個,並將它加入到你的表中 - 你使用哪種RDBM(Oracle/MySQL/SQL Server/DB2/... +版本)? – Aprillion

+0

我正在使用PostgreSQL。將嘗試創建一個日曆表。謝謝。 – Myxtic

+1

如果你需要'02/30/2012'使它成爲一個varchar類型而不是日期;)順便說一句,爲什麼不使用月份(整數像201201)而不是不存在的日期? – Aprillion

回答

0

我這樣做的方式是擁有一個包含所有日期列表的靜態表。在你的情況下,這是每個月的30(2月左右?)。讓我們調用這個表REF_DATE。它有一個保存日期的單列DT。

假設MY_TABLE只包含0或至多1個不同的日期(30日)在每個月,你需要做的是:

select DT,count(ID) from 
REF_DT REF 
left outer join my_table MT 
on REF.DT=my_table.DATE 
group by REF.DT; 
0

我想出了有點hackish的方式,通過軌道

class Month<Date # for getting months in range 
    def succ 
    self >> 1 
    end 
end 

range = Month.new(2010,1,1)..Month.new(2013,1,1) # range of date to query 
months=Hash.new 
(range).each do |month| 
    months.merge!({month.to_s => 0}) # get all months as per range requirement of project 
end 

db_months = MyTable.find_all_by_date(range).group_by{ |u| u.date.beginning_of_month }.map{|m,v| [m.to_s , v.size]} #get all records grouped by months 

all_months = months.merge(Hash[db_months]) # merge all missing months 

根據您的要求,用您想要的日期替換範圍和日期的格式。