当对象可能为零时求和

时间:2012-11-10 14:04:29

标签: sql ruby-on-rails activerecord join sum

我有以下代码行:

@ranking_array  = User.joins(:bets, :choices).select("users.id, sum(bets.profitloss + choices.profitloss) as total_pl").group("users.id").order("total_pl DESC").map(&:id)

这给了我一个用户排名的数组 - 比如用户X排在第25位,依此类推。

但问题是如果用户没有对任何选择下注,结果将不包括该用户。

那么如何修复代码,所以即使选择的赌注是零,它总结了利润损失。

解决方案:

嗯..似乎我必须将你的两个答案结合起来才能使它发挥作用:)

我需要LEFT JOINCOALESCE,所以我得到了以下代码,这些代码可以工作..

@ranking_array  = User.find(:all,
                  :joins =>  "LEFT JOIN `bets` ON bets.user_id = users.id LEFT JOIN `choices`ON choices.user_id = users.id",
                  :select => "users.id, sum(COALESCE(bets.profitloss, 0) + COALESCE(choices.profitloss, 0)) as total_pl",
                  :group =>  "users.id",
                  :order =>  "total_pl DESC").map(&:id)

非常感谢..我已经使用了所有的日常工作来解决这个问题。

问题是谁得到答案现在它是两者的组合?

2 个答案:

答案 0 :(得分:1)

我不得不使用这一天类似的东西,看看COALESCE(某事,0)将返回一个或另一个。地狱我认为你可以在0之前添加更多选项,因为它将继续下行直到0。

@ranking_array  = User.joins(:bets, :choices).select("users.id, sum(COALESCE(bets.profitloss, 0) + COALESCE(choices.profitloss, 0)) as total_pl").group("users.id").order("total_pl DESC").map(&:id)

答案 1 :(得分:1)

我自己并不使用Ruby,但是对于没有做过任何“下注”的用户,你说你“缺少”行。这听起来像您的实际查询生成INNER JOIN而您需要LEFT JOIN。看看this SO answer helps