【问题标题】:Calculate Month Statistics计算月统计
【发布时间】:2012-07-25 10:08:47
【问题描述】:

我有一个捐款表,我正在尝试计算每个月的总金额。几个月没有任何捐款,我希望结果返回 0。

这是我当前的查询:

Donation.calculate(:sum, :amount, :conditions => { 
  :created_at => (Time.now.prev_year.all_year) }, 
  :order => "EXTRACT(month FROM created_at)", 
  :group => ["EXTRACT(month FROM created_at)"])

返回:

{7=>220392, 8=>334210, 9=>475188, 10=>323661, 11=>307689, 12=>439889}

任何想法如何抓住空的月份?

【问题讨论】:

    标签: ruby-on-rails postgresql activerecord group-by


    【解决方案1】:

    除了 mu 太短 答案之外,在 Rails 3.2.12 中对我不起作用,ActiveRecord 将键作为字符串返回:

    h = Donation.calculate(:sum, :amount, :conditions => { 
        :created_at => (Time.now.prev_year.all_year) }, 
        :order => "EXTRACT(month FROM created_at)", 
        :group => ["EXTRACT(month FROM created_at)"])
    

    返回:

    {"7"=>220392, "8"=>334210, "9"=>475188, "10"=>323661, "11"=>307689, "12"=>439889}
    

    所以当我将散列与零合并时:

    {1=>0, 2=>0, 3=>0, 4=>0, 5=>0, 6=>0, 7=>0, 8=>0, 9=>0, 10=>0, 11=>0, 12=>0, "7"=>220392, "8"=>334210, "9"=>475188, "10"=>323661, "11"=>307689, "12"=>439889}
    

    小修复(to_s):

    Hash[(1..12).map { |month| [ month.to_s, 0 ] }].merge(h)
    

    【讨论】:

      【解决方案2】:

      通常您会离开加入日历表(或 PostgreSQL 中的 generate_series)来获取缺失的月份,但使用 Rails 最简单的方法是将您的结果合并到零散列中;像这样:

      class Donation
        def self.by_month
          h = Donation.calculate(:sum, :amount, :conditions => { 
            :created_at => (Time.now.prev_year.all_year) }, 
            :order => "EXTRACT(month FROM created_at)", 
            :group => ["EXTRACT(month FROM created_at)"])
          Hash[(1..12).map { |month| [ month, 0 ] }].merge(h)
        end
      end
      

      然后只需调用类方法h = Donation.by_month 即可获取结果。

      【讨论】:

      • 哇,这正是我想要的。非常感谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-02
      • 1970-01-01
      相关资源
      最近更新 更多