如何使用Sequel ORM对同一个表中的一列进行求和,以生成三个不同的聚合?

时间:2015-03-24 18:36:08

标签: ruby postgresql sequel

我的疑问是:

DB[:expense_projects___p].where(:project_company_id=>user_company_id).
  left_join(:expense_items___i, :expense_project_id=>:project_id).
  select_group(:p__project_name, :p__project_id).
  select_more{count(:i__item_id)}.
  select_more{sum(:i__amount)}.to_a.to_json

有效。

但是,付款方式包括现金,卡和发票。因此,我想总结每一个用于汇总目的,以实现现金,卡和发票的独立付款总额。我在查询中包含以下行

select_more{sum(:i__amount).where(:i__mop => 'card')}.

,错误消息是

NoMethodError - undefined method `where' for #<Sequel::SQL::Function:0x007fddd88b5ed0>:

所以我用

分别创建了数据集
ds1 = expense_items.where(:mop=>'card', :expense_company_id=>user_company_id).sum(:amount)

并在原始查询的末尾附加

select_append{ds1}

现在返回的json取得了部分成功:

{"project_name":"project 2","project_id":2,"count":4,"sum":"0.40501E3","?column?":"0.2381E2"}

可以看出,为了在我的getJSON调用中引用它,我没有这个元素的名称。我试图通过添加___a来添加标识符 到ds1查询如下

ds1 = expense_items.where(:mop=>'card', :expense_company_id=>user_company_id).sum(:amount___a)

但失败了。

总之,这是正确的方法,在任何情况下,我如何在进行续集总和查询时提供标识符?换句话说sum(:a_column).as(a_name)

非常感谢。

2 个答案:

答案 0 :(得分:1)

我不确定接近(更好地问Jeremy Evans)但是它有效。

您只需更改:.sum(... to .select_more {:amount ___ a).as(:desired_name)}

ds1 = expense_items.where(:mop=>'card',    :expense_company_id=>user_company_id).select_more{:amount___a).as(:desired_name)}

并实际在db响应中获取所需的名称。

答案 1 :(得分:1)

Dataset#sum返回总和,而不是修改后的数据集。你可能想要这样的东西:

ds1 = expense_items.where(:mop=>'card', :expense_company_id=>user_company_id).select{sum(:amount)}
select_append{ds1.as(:sum)}