Tengo una tabla con columnas como año, trimestre, equipo y precio. muestra cada venta del equipo. Contamos con 10 equipos en la firma. Quiero saber para cada trimestre de cada año, qué tres equipos vendieron más en general. Entonces, ¿dónde estoy atrapado? En este punto, agrupé las ventas totales por equipo, por trimestre, por año. Todavía faltan los tres mejores equipos con mayores ventas. Tengo esto hasta ahora:

SELECT 
    a1.year,
    a1.quarter,
    a1.team,
    sum(a1.price) as Total

FROM
    tbl_sales a1    

inner JOIN
    tbl_sales a2 
        ON a1.year = a2.year
            and a1.quarter = a2.quarter
            and a1.team = a2.team
            and a1.price = a2.price
     where
           some restrictions here
GROUP BY
    a1.year,
    a1.quarter,
    a1.team

Algo me dice que estoy cerca, que solo una subconsulta con la función superior ayudará, pero simplemente no puedo resolverlo. Cualquier ayuda es muy apreciada :) ¡Muchas gracias!

1
luftlinie 11 ago. 2016 a las 17:49

2 respuestas

La mejor respuesta

Tratar:

SELECT TOP 3
    a1.year,
    a1.quarter,
    a1.team,
    sum(a1.price) as Total

FROM
    tbl_sales a1    

inner JOIN
    tbl_sales a2 
        ON a1.year = a2.year
            and a1.quarter = a2.quarter
            and a1.team = a2.team
            and a1.price = a2.price
     where
           some restrictions here
GROUP BY
    a1.year,
    a1.quarter,
    a1.team

ORDER BY 
    sum(a1.price) DESC

Edite, intente lo siguiente, es posible que necesite criterios adicionales para asegurarse de obtener el conjunto de resultados correcto, pero esto debería devolver los 3 primeros de cada trimestre que se especifica en la cláusula where, no sé por qué está utilizando una autounión, así que dejó eso, pero se puede volver a agregar si es necesario:

SELECT TOP 3
    a1.year,
    a1.quarter,
    a1.team,
    sum(a1.price) as Total

FROM
    tbl_sales a1

WHERE
     'some restrictions here'
     AND a1.quarter = 1 --(or however quarters are identified)
     AND a1.year = 2015 --(or however years are identified)

GROUP BY
    a1.year,
    a1.quarter,
    a1.team

ORDER BY 
    sum(a1.price) DESC

UNION ALL

SELECT TOP 3
    a2.year,
    a2.quarter,
    a2.team,
    sum(a2.price) as Total

FROM
    tbl_sales a2

WHERE
    'some restrictions here'
    AND a2.quarter = 2
    AND a2.year = 2015

GROUP BY
    a2.year,
    a2.quarter,
    a2.team

ORDER BY 
    sum(a2.price) DESC

UNION ALL

SELECT TOP 3
    a3.year,
    a3.quarter,
    a3.team,
    sum(a3.price) as Total

FROM
    tbl_sales a3

WHERE
    'some restrictions here'
    AND a3.quarter = 3
    AND a3.year = 2015

GROUP BY
    a3.year,
    a3.quarter,
    a3.team

ORDER BY 
    sum(a3.price) DESC

UNION ALL

SELECT TOP 3
    a1.year,
    a1.quarter,
    a1.team,
    sum(a1.price) as Total

FROM
    tbl_sales a4

WHERE
    'some restrictions here'
    AND a4.quarter = 4
    AND a4.year = 2015

GROUP BY
    a4.year,
    a4.quarter,
    a4.team

ORDER BY 
    sum(a4.price) DESC

Como puede ver, básicamente no hay diferencia entre las tablas, excepto la cláusula where, no está limitado a una unión de solo esas 4 tablas, es solo un ejemplo, pero tenga en cuenta que si necesita cubrir más trimestres, tendrá que agregar más tablas para unir. Esto puede resultar muy difícil de manejar, ya que requiere que continúe agregando tablas a la unión a medida que pasa el tiempo.

0
ThisIsImpossible 12 ago. 2016 a las 15:13

En MS Access, puede hacer esto usando IN con TOP:

select s.*
from tbl_sales as s
where s.team in (select top (3) s2.team
                 from tbl_sales as s2
                 where s2.year = s.year and s2.quarter = s.quarter
                 order by s2.price desc
                );

Es posible que deba agregar las restricciones tanto a la consulta externa como a la interna, dependiendo de cuáles sean.

0
Gordon Linoff 11 ago. 2016 a las 14:52