SQL查询返回零的日期表中不存在(SQL query to return nil for dates

2019-10-16 23:06发布

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

提前致谢。

Answer 1:

我这样做的方法是有一个静态表的所有日期的列表。 在你的情况这是每个月的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;


Answer 2:

我想出了通过轨有点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

替换日期你也想日期按照您的要求的格式范围。




文章来源: SQL query to return nil for dates not present in the table