基于布尔列的条件和

时间:2015-05-13 13:35:57

标签: sql ruby-on-rails postgresql activerecord rails-activerecord

我使用chartkickgroupdate构建图表:

line_chart @product.stocks.group_by_date(:date).sum(:quantity)

这项工作正常,但我收到了错误的数据,因为在stocks表中,quantity取决于另一列stock_in boolean。< / p>

  • quantity无法存储为负数,只支持正数。
  • 检索quantity时,我们检查stock_in布尔值以计算产品数量的总和

实施例

product_id  |  quantity  |  stock_in  |  date

1              32           true         13-06-2015
1              8            true         13-06-2015
1              10           false        13-06-2015

此处的数量以这种方式计算:32 + 8 - 10 = 30

使用时

line_chart @product.stocks.group_by_date(:date).sum(:quantity)

日期13-06-2015的数量总和为40,这是错误的

我该如何解决?类似的东西:

line_chart @product.stocks.group_by_date(:date).sum { |s| s.stock_in? ? s.quantity : -1 * s.quantity }

2 个答案:

答案 0 :(得分:2)

如果你想在PostgreSQL(而不是rails应用程序)中执行总和,你可以这样做:

line_chart @product.stocks
                   .group_by_date(:date)
                   .sum("quantity * (case stock_in when TRUE then 1 else -1 end)")

答案 1 :(得分:1)

您可以尝试以下操作:

@product.stocks.group_by_date(:date)
        .sum("case when stock_in then quantity else -quantity end")