2012-10-08 65 views
6

Este es un problema bastante básico y por cualquier razón no puedo encontrar una solución razonable. Haré todo lo posible para explicar.Utilizando funciones distintas y luego agregadas en Postgresql?

Digamos que tiene un boleto de evento (sección, fila, número de asiento). Cada boleto pertenece a un asistente. Múltiples entradas pueden pertenecer al mismo asistente. Cada asistente tiene un valor (por ejemplo: el asistente # 1 vale $ 10,000). Dicho esto, esto es lo que quiero hacer:

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

Aquí es donde yo estoy teniendo problemas: Si el participante Nº 1 es un valor de $ 10.000 y está utilizando 4 entradas, suma (attendees.worth) está regresando $ 40.000. Lo cual no es exacto. El valor debería ser de $ 10,000. Sin embargo, cuando hago que el resultado sea distinto para el asistente, el recuento no es preciso. En un mundo ideal que sería bueno hacer algo como

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 

Obviamente esta consulta no funciona. ¿Cómo puedo lograr esto mismo en una sola consulta? O incluso es posible? Preferiría mantenerme alejado de subconsultas también porque esto es parte de una solución mucho más grande en la que tendría que hacer esto en múltiples tablas.

Además, el valor debe seguir el boleto dividido de manera uniforme. Ej: $ 10,000/4. Cada boleto tiene un valor de asistente de $ 5,000. Entonces, si los boletos están en diferentes secciones, ellos toman su valor prorrateado con ellos.

Gracias por su ayuda.

+0

Sé que ha pasado un tiempo, pero estoy teniendo exactamente el mismo tipo de problema y me pregunto si fue capaz de resolverlo. – denaje

Respuesta

2

Es necesario agregar las entradas antes de que los asistentes:

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 

Usted todavía tiene un problema de un solo participante tener asientos en varias secciones. Sin embargo, no especificas cómo resolver eso (repartir el valor? Elegir aleatoriamente una sección? Atribuirlo a todas las secciones? Canónicamente elegir una sección?)

+0

Gracias por esto, pero ¿no es esto lo que sigue contando el valor varias veces? El valor está determinado por la cantidad de boletos. Ej .: El asistente # 1 tiene un valor de $ 10,000 y está usando 4 boletos. Cada boleto aporta $ 5,000 al valor. Entonces, si cada boleto estaba en una sección diferente, agregaría $ 5,000 a su respectiva sección. ¿Tiene sentido? –

+0

¿No genera esto un error? La tabla derivada ("ta") no se agrupa correctamente. Estoy bastante seguro de que PostgreSQL rechazará eso. –

+0

@a_horse_with_no_name. . . Sí, arreglé el código para que coincida con mi intención. –

Cuestiones relacionadas