1

我有一个表'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} 

提前致谢。

4

2 回答 2

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;
于 2012-07-03T20:51:59.770 回答
0

我想出了一些有点骇人听闻的方式穿过铁轨

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

根据您的要求,将范围替换为您想要的日期以及日期的格式。


于 2012-07-07T23:16:19.563 回答