简体   繁体   English

如何执行单个SQL查询以汇总ActiveRecord中分组结果的列?

[英]How to perform single sql query to sum columns from grouped results in activerecord?

I have two models - Parent and Params , where parent has_many params 我有两个模型ParentParams ,其中parent has_many params

Currently, my methods looks like (not that it is under Parent class): 当前,我的方法看起来像(不是在Parent类下):

def total_sum
  params.select(
    'params.*, (
      SUM(mono_volume_annular) + 
      SUM(day_volume_annular) + 
      SUM(night_volume_annular) + 
      SUM(exclusive_volume_annular)
    ) AS summed_volume_annular'
  ).group('params.id').sum(&:summed_volume_annular)
end

How can I improve this SQL query to get rid of .sum(&:summed_volume_annular) method call? 如何改善此SQL查询以摆脱.sum(&:summed_volume_annular)方法调用?

If I'll try to summarize it without converting :summed_volume_annular to proc, I'll get this error: ActiveRecord::StatementInvalid: PG::UndefinedColumn: ERROR: column "summed_volume_annular" does not exist 如果我尝试在不将:summed_volume_annular转换为proc的情况下对其进行汇总,则会收到以下错误消息: ActiveRecord::StatementInvalid: PG::UndefinedColumn: ERROR: column "summed_volume_annular" does not exist

An interesting note - If I'll try to save the result of this query 一个有趣的注释-如果我尝试保存此查询的结果

params.select('(
    SUM(mono_volume_annular) + 
    SUM(day_volume_annular) + 
    SUM(night_volume_annular) + 
    SUM(exclusive_volume_annular)
  ) AS summed_volume_annular'
)

I will get this object [#<Parameter:0x00000009f1c7d8 id: nil>] 我将获得此对象[#<Parameter:0x00000009f1c7d8 id: nil>]

Strange that summed_volume_annular is absent... 奇怪的是summed_volume_annular不存在...

I would do something like this: 我会做这样的事情:

def total_sum
  columns_to_sum = %w(mono_volume_annular day_volume_annular night_volume_annular
                      exclusive_volume_annular)
  sum = columns_to_sum.map{ |col| "COALESCE(#{col}, 0)" }.join(' + ')
  Params.sum(sum)
end

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM