如何使用 Sequel ORM 对同一 table 中的一列求和以生成三个不同的聚合?
How can I sum one column from the same table, to produce three different aggregates, using Sequel ORM?
我的查询是这样的:
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)
但是失败了。
总而言之,这是正确的方法吗?无论如何,在执行 sequel 求和查询时如何提供标识符?也就是说sum(:a_column).as(a_name)
非常感谢。
我不确定方法(最好问 Jeremy Evans),但它有效。
您只需将:.sum(... 更改为 .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)}
并在数据库响应中实际得到 desired_name。
Dataset#sum returns 总和,而不是修改后的数据集。你可能想要这样的东西:
ds1 = expense_items.where(:mop=>'card', :expense_company_id=>user_company_id).select{sum(:amount)}
select_append{ds1.as(:sum)}
我的查询是这样的:
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)
但是失败了。
总而言之,这是正确的方法吗?无论如何,在执行 sequel 求和查询时如何提供标识符?也就是说sum(:a_column).as(a_name)
非常感谢。
我不确定方法(最好问 Jeremy Evans),但它有效。
您只需将:.sum(... 更改为 .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)}
并在数据库响应中实际得到 desired_name。
Dataset#sum returns 总和,而不是修改后的数据集。你可能想要这样的东西:
ds1 = expense_items.where(:mop=>'card', :expense_company_id=>user_company_id).select{sum(:amount)}
select_append{ds1.as(:sum)}