基于布尔列的条件求和
Conditional sum based on boolean column
我正在使用 chartkick with groupdate 构建图表:
line_chart @product.stocks.group_by_date(:date).sum(:quantity)
这工作正常,但我得到了错误的数据,因为在 stocks
table 中 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 }
您可以尝试以下方法:
@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)")
我正在使用 chartkick with groupdate 构建图表:
line_chart @product.stocks.group_by_date(:date).sum(:quantity)
这工作正常,但我得到了错误的数据,因为在 stocks
table 中 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 }
您可以尝试以下方法:
@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)")