【问题标题】:Conditional sum based on boolean column基于布尔列的条件和
【发布时间】:2015-05-13 13:35:57
【问题描述】:

我正在使用chartkickgroupdate 来构建图表:

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

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

  • 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 }

【问题讨论】:

  • 您使用的是什么数据库? MySQL? Postresql?

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


【解决方案1】:

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

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

【讨论】:

  • 同意。这属于数据库端
【解决方案2】:

您可以尝试以下方法:

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

【讨论】:

  • 我得到 PG::GroupingError: ERROR: column "stocks.id" 必须出现在 GROUP BY 子句中或用于聚合函数中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-01
  • 1970-01-01
  • 2017-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多