2012-10-08 4 views
6

Dies ist ein ziemlich grundlegendes Problem und aus irgendeinem Grund kann ich keine vernünftige Lösung finden. Ich werde mein Bestes geben, um es zu erklären.Verwenden von distinct und dann eine Aggregatfunktion in Postgresql?

Angenommen, Sie haben ein Ereignis Ticket (Abschnitt, Zeile, Sitz #). Jedes Ticket gehört einem Teilnehmer. Mehrere Tickets können zum selben Teilnehmer gehören. Jeder Teilnehmer hat einen Wert (z. B .: Teilnehmer # 1 ist 10.000 $ wert). Das heißt, hier ist es, was ich tun möchte:

1. Group the tickets by their section 
2. Get number of tickets (count) 
3. Get total worth of the attendees in that section 

Hier ist, wo ich Probleme habe: Wenn Teilnehmer # 1 ist im Wert von $ 10.000 und wird unter Verwendung von 4 Tickets, sum (attendees.worth) zurückkehrt $ 40.000. Was nicht genau ist. Der Wert sollte 10.000 $ sein. Wenn ich jedoch das Ergebnis für den Teilnehmer deutlich mache, ist die Anzahl nicht korrekt. In einer idealen Welt wäre es schön, etwas wie

zu tun

Offensichtlich funktioniert diese Abfrage nicht. Wie kann ich dasselbe in einer einzigen Abfrage erreichen? ODER ist es überhaupt möglich? Ich würde es vorziehen, auch von Unterabfragen fern zu bleiben, weil dies Teil einer viel größeren Lösung ist, wo ich dies über mehrere Tabellen hinweg tun müsste.

Auch der Wert sollte dem Ticket gleichmäßig verteilt folgen. Beispiel: $ 10.000/4. Jedes Ticket hat einen Teilnehmer im Wert von $ 5.000. Wenn also die Tickets in verschiedenen Abschnitten sind, nehmen sie ihren anteiligen Wert mit.

Danke für Ihre Hilfe.

+0

Ich weiß, es ist eine Weile her, aber ich habe genau das gleiche Art von Problem und ich frage mich, ob Sie es lösen konnten. – denaje

Antwort

2

Sie müssen die Tickets vor den Teilnehmern aggregieren:

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 

Sie haben noch ein Problem eines einzelnen Teilnehmers Sitze in mehreren Abschnitten mit. Jedoch geben Sie nicht an, wie man das löst (verteilen Sie den Wert? Nach dem Zufall wählen Sie einen Abschnitt? Attribut es allen Bereichen zu? Kanonisch wählen Sie einen Abschnitt?)

+0

Danke dafür, aber zählt das nicht immer noch mehrfach? Der Wert wird durch die Anzahl der Tickets bestimmt. Beispiel: Teilnehmer # 1 hat einen Wert von $ 10.000 und verwendet 4 Tickets. Jedes Ticket trägt $ 5.000 zum Wert bei. Wenn sich also jedes Ticket in einem anderen Abschnitt befindet, würde es $ 5000 zu seinem entsprechenden Abschnitt hinzufügen. Ist das sinnvoll? –

+0

Generiert dies nicht einen Fehler? Die abgeleitete Tabelle ("ta") wird nicht richtig gruppiert. Ich bin mir ziemlich sicher, dass PostgreSQL das ablehnen wird. –

+0

@a_horse_with_no_name. . . Ja, ich habe den Code so festgelegt, dass er meiner Absicht entspricht. –