Ruby on rails Rails:使用postgres防止被零除

Ruby on rails Rails:使用postgres防止被零除,ruby-on-rails,postgresql,Ruby On Rails,Postgresql,我有一个带有postgre数据库的rails应用程序,我正试图通过以下语句获取一些指标 Negotiation.find(:all, :conditions => conditions_hash('negotiation'), :select => 'sum(payment_term * amount_after_annualised_base) / sum(amount_after_annualised_base) as pt').first 我如何确保总和(金额在年化基数之后)

我有一个带有postgre数据库的rails应用程序,我正试图通过以下语句获取一些指标

Negotiation.find(:all, :conditions => conditions_hash('negotiation'), :select => 'sum(payment_term * amount_after_annualised_base) / sum(amount_after_annualised_base) as pt').first
我如何确保总和(金额在年化基数之后)不是0(因此不会抛出“零除”错误)

我发现了这个,但不确定它是否正确/最佳/最有效

Negotiation.find(:all, :conditions => conditions_hash('negotiation'), :select => 'sum(payment_term * amount_after_annualised_base) / (CASE sum(amount_after_annualised_base) WHEN 0 THEN NULL ELSE sum(amount_after_annualised_base) END) as pt').first
谢谢! 皮埃尔

怎么样:

Negotiation.find(:all, 
                 :conditions => conditions_hash('negotiation'), 
                 :select => 'sum(amount_after_annualised_base) sum_amount,
                             sum(payment_term * amount_after_annualised_base) / greatest(1,sum_amount) as pt').first
如果总和为零,请输入代码。

如何:

Negotiation.find(:all, 
                 :conditions => conditions_hash('negotiation'), 
                 :select => 'sum(amount_after_annualised_base) sum_amount,
                             sum(payment_term * amount_after_annualised_base) / greatest(1,sum_amount) as pt').first
如果总和为零,请输入代码。

使用:

这仅仅是您的解决方案的一个简写:

Negotiation.find(:all, :conditions => conditions_hash('negotiation'), :select => 'sum(payment_term * amount_after_annualised_base) / (CASE sum(amount_after_annualised_base) WHEN 0 THEN NULL ELSE sum(amount_after_annualised_base) END) as pt').first
使用:

这仅仅是您的解决方案的一个简写:

Negotiation.find(:all, :conditions => conditions_hash('negotiation'), :select => 'sum(payment_term * amount_after_annualised_base) / (CASE sum(amount_after_annualised_base) WHEN 0 THEN NULL ELSE sum(amount_after_annualised_base) END) as pt').first

我想你需要写一些类似的东西

Negotiation.find(
  :all, :conditions => conditions_hash('negotiation'), 
  :select => 'CASE sum(amount_after_annualised_base) WHEN 0 THEN NULL ELSE sum(payment_term * amount_after_annualised_base) / sum(amount_after_annualised_base) END as pt').first

如果
总和(年化基数后的金额)
为零,则返回NULL,否则将执行请求的除法。

我认为您需要编写以下内容

Negotiation.find(
  :all, :conditions => conditions_hash('negotiation'), 
  :select => 'CASE sum(amount_after_annualised_base) WHEN 0 THEN NULL ELSE sum(payment_term * amount_after_annualised_base) / sum(amount_after_annualised_base) END as pt').first

如果
总和(年化基数后的金额)
为零,则返回NULL,否则请求的除法无效。

这是否有效?因为你在任何情况下都会尝试除法,这样行吗?因为你在所有情况下都会尝试除法。很好,使用最大值(1,总和)是最酷的方法。谢谢。很好,使用最大的(1,总和)是最酷的方式。谢谢