Totalización de valores y búsqueda de los valores x superiores

Situación:

Tengo una base de datos que contiene registros de ventas, cada registro tiene una ID (PK), Código de producto, Año, Mes, Volumen de ventas.

Como usuario especificaré el año, por lo que si especifico 1980, consultaré en la base de datos todos los registros que correspondan a ese año.

Estoy tratando de crear una consulta que sume los meses SalesVolumes para el año especificado, luego seleccione los 5 valores de volumen de ventas principales.

Lo que he recopilado hasta ahora es hacer lo anterior de alguna manera, luego elegir los 5 valores principales de volúmenes de ventas, ponerlos en orden descendente y seleccionar los 5 principales, pero eso es todo lo que tengo.

Tenga en cuenta que en un año habrá SalesVolumes para múltiples productos:

ID,     Product Code, Year, Month, SalesVolume
23041   121           1980  1      21
23042   121           1980  2      960
23043   121           1980  3      939
23044   121           1980  4      927
23045   121           1980  5      931
23046   121           1980  6      950
23047   121           1980  7      975
23048   121           1980  8      994
23049   121           1980  9      994
23050   121           1980  10     968
23051   121           1980  11     918
23052   121           1980  12     854
23425   122           1980  1      1002
23426   122           1980  2      1032
23427   122           1980  3      1090
23428   122           1980  4      1062
23429   122           1980  5      1010
23430   122           1980  6      1103
23431   122           1980  7      1214
23432   122           1980  8      1122
23433   122           1980  9      1019
23434   122           1980  10     1181
23435   122           1980  11     1343
23436   122           1980  12     1180

Rendimiento esperado:

Para 1980

Product Code, SalesVolume
121         , (total SalesVolume of the 12 months)
122         , (total SalesVolume of the 12 months)

preguntado el 03 de mayo de 12 a las 21:05

¿Puede mostrar el resultado deseado según el ejemplo anterior? Hasta ahora no está claro lo que quiere obtener. -

Para el código de producto de 1980, SalesVolume 121, (total SalesVolume de los 12 meses) 122, (total SalesVolume de los 12 meses) -

Ah, eso editó terrible, lo agregaré a mi publicación original:

Parece que la respuesta ya ha sido publicada =) -

1 Respuestas

Esto es lo que puede hacer: sume las ventas de cada artículo para un año determinado, clasifíquelos y luego seleccione los 5 artículos principales.

SELECT *
FROM (
    SELECT "Product Code",
        SUM(SalesVolume) as total,
        RANK() OVER (ORDER BY SUM(SalesVolume) DESC) as rnk
    FROM YourTable
    WHERE Year = 1980
    GROUP BY "Product Code"
) A
WHERE rnk <= 5

Si desea seleccionar los 5 mejores por año para todos los años, también puede hacerlo:

SELECT *
FROM (
    SELECT Year,
        "Product Code",
        SUM(SalesVolume) as total,
        RANK() OVER (PARTITION BY Year ORDER BY SUM(SalesVolume) DESC) as rnk
    FROM YourTable
    GROUP BY Year, "Product Code"
) A
WHERE rnk <= 5

contestado el 03 de mayo de 12 a las 21:05

¿Podría explicar para qué sirve la A después del paréntesis? Todavía no estoy tan metido en SQL :) - mitchellt

Me alegro de haber podido ayudar. La A es simplemente dar un nombre a la subconsulta. No estoy seguro del motivo, pero es necesario (al menos por SQL Server). El SELECT * podría ser SELECT A.* e incluso podría unirse a otra mesa para A. - Chad

@MitchellT: tenga en cuenta que si, por ejemplo, dos productos empatan en el total máximo y luego cuatro productos más empatan en el siguiente total más grande, RANK() los clasificaría como 1, 1, 3, 3, 3, 3, y todas esas filas serían devueltas por la consulta, según el rnk <= 5 condición. Si quieres no más 5 productos, uso ROW_NUMBER() en lugar de. Si quieres hasta 5 diferentes cifras (y la cantidad de productos que tengan esos totales), use DENSE_RANK(). - andriy m

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.