7

这是一个非常基本的问题,无论出于何种原因,我都找不到合理的解决方案。我会尽力解释。

假设您有一张活动门票(部分、行、座位号)。每张票都属于一个与会者。多张票可以属于同一个与会者。每个与会者都有一个价值(例如:与会者 #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 美元的参加者。因此,如果门票在不同的部分,他们会随身携带按比例分配的价值。

谢谢你的帮助。

4

2 回答 2

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

您仍然会遇到单个与会者在多个部分有座位的问题。但是,您没有指定如何解决这个问题(分配价值?随机选择一个部分?将其归因于所有部分?规范地选择一个部分?)

于 2012-10-08T17:43:54.730 回答
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
于 2019-06-25T09:47:49.470 回答