使用sum函数时如何避免PG :: NumericValueOutOfRange

iro*_*and 10 sql postgresql ruby-on-rails

我有这样的方法:

  def self.weighted_average(column)
    sql = "SUM(#{column} * market_cap) / SUM(market_cap) as weighted_average"
    Company.select(sql).to_a.first.weighted_average
  end
Run Code Online (Sandbox Code Playgroud)

当列是a时decimal,它会返回一个没有问题的值.但是当列是integer,该方法最终会PG::NumericValueOutOfRange出错.

我应该改变列的类型integerdecimal,还是有一种方式来获得的结果sum不改变列的类型?

And*_*eko 2

您可以将值转换为始终为十进制值,因此无需更改列类型:

sql = "SUM(#{column} * CAST(market_cap as decimal(53,8))) / SUM(CAST(market_cap as decimal(53,8))) as weighted_average"
Run Code Online (Sandbox Code Playgroud)

PS 我会改变列类型 - 那么它是一致的