基于布尔列的条件求和

Conditional sum based on boolean column

我正在使用 chartkick with groupdate 构建图表:

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

这工作正常,但我得到了错误的数据,因为在 stocks table 中 quantity 取决于另一列 stock_inboolean.

示例:

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 }

您可以尝试以下方法:

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

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

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