【问题标题】:How can I sum one column from the same table, to produce three different aggregates, using Sequel ORM?如何使用 Sequel ORM 对同一张表中的一列求和以生成三个不同的聚合?
【发布时间】:2015-04-03 23:38:29
【问题描述】:

我的查询是这样的:

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)

非常感谢。

【问题讨论】:

    标签: ruby postgresql sequel


    【解决方案1】:

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

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

    【讨论】:

    • 你这个杰里米,一如既往。我非常感谢这里的帮助。它工作得很好,我可以对不同的项目进行多次,所以 select_append{ds1.as(:sum)} 可以是 as(:card_amount) 和 as(:invoice_amount) 等等。正是我所追求的。再次感谢。
    【解决方案2】:

    我不确定方法(最好问问 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)}
    

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

    【讨论】:

    • 谢谢,我会对其进行测试并昏迷以发表评论或给它一个“打勾”。感谢您的时间。我如何联系杰里米?
    • 谢谢,但恐怕这不起作用。一开始就缺少“总和”,所以如果我更改为 select_more{sum(:amount___a).as(total_card))} 我会错误地得到一个组。无论如何我不得不改变它,我不明白为什么 :amount___a 而不仅仅是 :amount。
    • 您好,我没有尝试,所以您可能是对的。关于“a__amount”这是我的错误,我认为它应该是 i__amount 或只是数量。 Jeremy 是 Sequel 的作者,您可以在网络上随处找到他的联系方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-21
    • 1970-01-01
    • 2017-08-22
    • 1970-01-01
    • 1970-01-01
    • 2011-11-05
    • 1970-01-01
    相关资源
    最近更新 更多