Totalización de valores y búsqueda de los valores x superiores
Frecuentes
Visto 86 veces
2
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)
1 Respuestas
3
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 sql or haz tu propia pregunta.
¿Puede mostrar el resultado deseado según el ejemplo anterior? Hasta ahora no está claro lo que quiere obtener. - Andrew Logvinov
Para el código de producto de 1980, SalesVolume 121, (total SalesVolume de los 12 meses) 122, (total SalesVolume de los 12 meses) - MitchellT
Ah, eso editó terrible, lo agregaré a mi publicación original: MitchellT
Parece que la respuesta ya ha sido publicada =) - Andrew Logvinov