我有一张'my_table'表。它有以下数据:
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}
提前致谢。
答案 0 :(得分:0)
我这样做的方法是拥有一个包含所有日期列表的静态表。在你的情况下,每个月的30日(二月份怎么样?)。让我们调用这个表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;
答案 1 :(得分: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
根据您的要求,将范围替换为您想要的日期格式。