【问题标题】:Applying aggregate function SUM together with GROUP BY将聚合函数 SUM 与 GROUP BY 一起应用
【发布时间】:2013-11-28 03:31:40
【问题描述】:

在 Active Record / Ruby on Rails 中执行此查询的最佳方式是什么

SELECT sum(amount) as total_amount FROM payments GROUP BY person_id, product_id

我似乎无法将sumgroup 方法联系起来。我必须在这里求助find_by_sql吗?

【问题讨论】:

  • Payment.group("person_id, product_id").sum("amount")。我认为 sum 方法接受 group_by 选项,但我不确定是否可以将它与多列定义一起使用。

标签: ruby-on-rails ruby ruby-on-rails-4 rails-activerecord


【解决方案1】:

类似:

Payment.group(:person_id).group(:product_id).sum(:amount)

应该给你一个散列,其键是[person_id, product_id] 数组,其值是总和。你可能不想:

Payment.group('person_id, product_id').sum(:amount)

虽然,这可能会给你正确的总和,但哈希键没有多大意义。

你也可以说:

Payment.sum(:amount, :group => 'person_id, product_id')

但这会像Payment.group('person_id, product_id').sum(:amount) 那样在按键中遭受同样的脑损伤;但是,:group 的数组:

Payment.sum(:amount, :group => [ :person_id, :product_id ])

应该产生与双 .group 版本相同的带有数组键的哈希。但是,sum:group 形式在 Rails4 中已弃用(感谢 Ganeshwara Herawan Hananda Put 注意到这一点)。

以上在 Rails3 中运行良好,我认为没有理由在 Rails4 中无法运行。我手边没有 Rails4 设置,所以无法验证。

【讨论】:

  • 让我免于数小时的头痛。顺便说一句,我使用了最后一个。
  • 似乎在 ActiveRecord 的未来版本中需要进行调整:“弃用警告:不推荐使用带有查找器选项的 Relation#calculate”
  • Payment.group(:person_id).group(:product_id).sum(:amount) 呢?
  • 在使用 group_by 和 sum 时,如何仅将总和作为整数而不是作为值的哈希值?
  • @W.M.您将从散列中提取所需组的总和。如果您只需要一个组的总和,那么您根本不想 GROUP BY,您需要使用 where 来选择您想要的组,然后对其求和。
猜你喜欢
  • 1970-01-01
  • 2018-05-19
  • 1970-01-01
  • 1970-01-01
  • 2014-08-24
  • 1970-01-01
  • 1970-01-01
  • 2014-11-22
  • 1970-01-01
相关资源
最近更新 更多