如何解决Rails + Postgres内部联接与聚合问题
这类问题无处不在...但这是我的问题。
我有rails模型:Organization
,Activity
,Donation
,DonationItem
。我试图获取每个Activity.hours
的{{1}}和DonationItem.amount
的总和。
我不能使用直线关系(例如:Organization
,因为我处于必须使用Organization.activities.pluck(:hours).sum
的情况下。
当前的Rails连接在下面,尽管在现阶段它们显然是不正确的:
Organization.select("...").group(...)
这是SQL结构(基本上是...),而select位于此处:http://sqlfiddle.com/#!17/fb932e/6
这是不希望查看SQL Fiddle的人们的选择
@relation = Organization.joins(:activities,donations: :donation_items)
.select("organizations.id,sum(activities.hours),sum(donation_items.amount)")
.group("organizations.id")
我了解问题所在,而不是解决问题的方法...
任何帮助将不胜感激。谢谢。
解决方法
在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,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
;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。