【问题标题】:Rails + Postgres Inner Join with aggregates issueRails + Postgres 内部加入聚合问题
【发布时间】:2020-08-12 15:57:17
【问题描述】:

这类问题到处都是……但这是我的问题。

我有 Rails 模型:OrganizationActivityDonationDonationItem。我正在尝试为每个 Organization 获取 Activity.hoursDonationItem.amount 的总和。

我不能使用直接关系(例如:Organization.activities.pluck(:hours).sum,因为我处于必须使用 Organization.select("...").group(...) 的情况。

当前的 rails 连接如下,尽管在这个阶段它们显然是不正确的:

 @relation = Organization.joins(:activities, donations: :donation_items)
                         .select("organizations.id, sum(activities.hours), sum(donation_items.amount)")
                         .group("organizations.id")

这是SQL结构(基本上...)+select位于这里:http://sqlfiddle.com/#!17/fb932e/6

这是不希望查看 SQL Fiddle 的人们的选择

select 
        o.id,
        sum(a.hours) as "hours", 
        sum(di.amount) as "amount"
    from organizations o
    inner join activities a 
        on a.organization_id = o.id
    inner join donations d 
        on d.organization_id = o.id
    inner join donation_items di
        on di.donation_id = d.id
    group by o.id
;

我明白问题是什么,只是没有解决它的方法......

任何帮助将不胜感激。谢谢。

【问题讨论】:

    标签: ruby-on-rails postgresql inner-join


    【解决方案1】:

    在 SQL 中,您可以使用 CTE 或子句来解决小时和金额值不正确的问题,但不确定如何在 rails 查询构建器中转换这些值

    使用 CTE

    with organization_activity as (
      select organization_id, sum(hours) as "hours"
      from activities
      group by organization_id 
    )
    select 
            o.id,
            a.hours as "hours", 
            sum(di.amount) as "amount"
        from organizations o
        inner join organization_activity a 
            on a.organization_id = o.id
        inner join donations d 
            on d.organization_id = o.id
        inner join donation_items di
            on di.donation_id = d.id
        group by o.id, a.hours
    ;
    

    使用子句

    select 
            o.id,
            a.hours as "hours", 
            sum(di.amount) as "amount"
        from organizations o
        inner join (
          select organization_id, sum(hours) as "hours"
          from activities
          group by organization_id
        ) a 
            on a.organization_id = o.id
        inner join donations d 
            on d.organization_id = o.id
        inner join donation_items di
            on di.donation_id = d.id
        group by o.id, a.hours
    ;
    

    DEMO

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-14
      • 1970-01-01
      • 1970-01-01
      • 2015-04-27
      • 1970-01-01
      • 2016-04-06
      • 2021-04-17
      相关资源
      最近更新 更多