1

テーブル「my_table」があります。次のデータがあります。

ID  ---   Date         

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

次のように、月ごとにグループ化された特定の日付間の ID の数を返す SQL クエリを作成できます。

{"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日です(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;
于 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 に答える