这是一个非常基本的问题,无论出于何种原因,我找不到合理的解决方案。我会尽力解释。
假设你有一张活动门票(部分,行,座位#)。每张票都属于与会者。多张票可以属于同一个与会者。每位与会者都有一个价值(例如:参加者#1价值10,000美元)。那就是说,这就是我想做的事情:
1. Group the tickets by their section
2. Get number of tickets (count)
3. Get total worth of the attendees in that section
这就是我遇到问题的地方:如果参加者#1价值10,000美元且使用4张门票,那么sum(attendees.worth)将返还$ 40,000。哪个不准确。价值应该是10,000美元。然而,当我将结果与参与者区分开来时,计数并不准确。在一个理想的世界里,做一些像
这样的事情会很好select
tickets.section,
count(tickets.*) as count,
sum(DISTINCT ON (attendees.id) attendees.worth) as total_worth
from
tickets
INNER JOIN
attendees ON attendees.id = tickets.attendee_id
GROUP BY tickets.section
显然这个查询不起作用。如何在单个查询中完成同样的事情?或者甚至可能吗?我更愿意远离子查询,因为这是一个更大的解决方案的一部分,我需要在多个表中执行此操作。
此外,值得按照票价平均分配。例如:$ 10,000 / 4.每张门票的参加者价值5,000美元。因此,如果门票分别在不同的部分,他们会按比例分配门票。
感谢您的帮助。
答案 0 :(得分:2)
您需要在与会者之前汇总门票:
select ta.section, sum(ta.numtickets) as count, sum(a.worth) as total_worth
from (select attendee_id, section, count(*) as numtickets
from tickets
group by attendee_id, section
) ta INNER JOIN
attendees a
ON a.id = ta.attendee_id
GROUP BY ta.section
您仍然遇到单个与会者在多个部分中拥有席位的问题。但是,你没有指定如何解决这个问题(分配价值?随机选择一个部分?将它归因于所有部分?规范地选择一个部分?)
答案 1 :(得分:0)
使用jsonb_object_agg:
select
tickets.section,
count(tickets.*) as count,
(
SELECT SUM(value::int4)
FROM jsonb_each_text(jsonb_object_agg(attendees.id, attendees.worth))
) as total_worth
from
tickets
INNER JOIN
attendees ON attendees.id = tickets.attendee_id
GROUP BY tickets.section