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

1 人の出席者が複数のセクションに席を持っているという問題がまだ残っています。ただし、それを解決する方法を指定していません (価値を配分する?ランダムに 1 つのセクションを選択する?すべてのセクションに割り当てる?標準的にセクションを選択する?)

于 2012-10-08T17:43:54.730 に答える