2012-10-08 11 views
6

これはかなり基本的な問題です。何らかの理由で私は合理的な解決策を見つけることができません。私は説明するために全力を尽くします。PostgreSQLでdistinct関数とaggregate関数を使用していますか?

イベントチケット(セクション、行、座席番号)があるとします。各チケットは出席者に属します。複数のチケットは同じ出席者に属することができます。各出席者は価値があります(例:出席者#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枚のチケットを使用している場合は、合計(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 

明らかにこのクエリは機能しません。どのようにして同じ質問を1つのクエリで達成できますか?またはそれは可能ですか?私は複数のテーブルでこれを行う必要があるはるかに大きなソリューションの一部であるので、私はサブクエリから遠ざかることを好むでしょう。

また、価値は均等に分けられた切符に従うべきです。例:$ 10,000/4。各チケットには$ 5,000の出席者がいます。したがって、チケットが異なるセクションにある場合、チケットはそれらと比例した価値を持ちます。

ありがとうございました。

+0

まあまあですが、あなたがそれを解決できるかどうか疑問に思っています。 – denaje

答えて

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

これはありがとうございますが、これはまだ価値が数えてカウントされていませんか?価値はチケット数によって決まります。例:出席者#1は$ 10,000の価値があり、4つのチケットを使用しています。各チケットは価値に5,000ドル寄付します。したがって、それぞれのチケットが異なるセクションにある場合、それぞれのセクションに5,000ドルが追加されます。それは理にかなっていますか? –

+0

これはエラーを生成しませんか?派生テーブル( "ta")は適切にグループ化されません。私はPostgreSQLがこれを拒否することは確かです。 –

+0

@a_horse_with_no_name。 。 。はい、私は自分の意図に合うようにコードを修正しました。 –

関連する問題