Consulta SQL con agrupamiento

Necesito una guía para poder desarrollar una consulta en MSSQL que me permita obtener la ciudad de más alta venta durante el mes de mayo, agrupada por años. La consulta que he logrado hasta el momento es la siguiente:

SELECT
F.CIUDAD, SUM(D.VALOR) AS [TOTAL], YEAR(F.FECHA) AS [AÑO]
FROM
DETALLE D
INNER JOIN
FACTURA F
ON F.NUMERO = D.NUMERO
WHERE
MONTH(F.FECHA) = 5
GROUP BY
F.CIUDAD, YEAR(F.FECHA)
ORDER BY
AÑO ASC, TOTAL DESC

Los datos obtenidos se muestran en la imagen siguiente:

Pero al ser agrupados por ciudad, me aparecen las 3 ciudades existentes, y únicamente necesito que aparezca la que tiene mayor cantidad de ventas, junto al año, es decir deberían aparecer únicamente 4 registros ya que serían los años tomados en cuenta.

Respuesta
3

Lo adapté para la base de datos que estoy usando y efectivamente sí funcionó. Pude además hacerlo mediante uso de particiones, y me parece correcto compartirlo.

with mejorvendedor as
(
select 
v.vendedor, 
sum(d.valor) as [total ventas], 
year(f.fecha) as [año],
row_number() over (partition by year(f.fecha) order by sum(d.valor) desc, year(f.fecha) desc) as rn
from
detalle d
inner join
factura f
on f.numero = d.numero
inner join
vendedor v
on f.cod_vendedor = v.cod_vendedor
group by
year(f.fecha), v.vendedor
)
select
mv.vendedor, mv.[total ventas], mv.año
from 
mejorvendedor mv
where
mv.rn = 1
order by
mv.año desc

1 respuesta más de otro experto

Respuesta
3

Hola iquiss,

Tu consulta es algo compleja y no se me ocurre de primeras una forma simple de resolverla así que he tenido que aplicar técnicas de tsql para hacer un bucle y resolver el problema.

-- Creamos una tabla temporal en memoria para almacenar los resultados
-- Desconozco cual es el tipo exacto de los datos de tu tabla así que tendrás que modificarlos para que coincidan con lo de tu tabla "Factura" y "Detalle"
DECLARE @resultados_tmp TABLE (
    ciudad nvarchar(50),
    total decimal,
    anyo int
)
-- Creamos las variables de puntero (al año) y el cursor en memoria para el bucle
DECLARE @year int
DECLARE tmp_cursor CURSOR 
  LOCAL STATIC READ_ONLY FORWARD_ONLY
FOR 
SELECT DISTINCT YEAR(fecha)  
FROM Factura
OPEN tmp_cursor 
FETCH NEXT FROM tmp_cursor INTO @year 
WHILE @@FETCH_STATUS = 0
BEGIN 
    -- Insertamos en la tabla temporal la factura de mayor importe de cada año con su correspondiente ciudad
    INSERT INTO @resultados_tmp 
      SELECT TOP 1 F.CIUDAD, SUM(D.VALOR), @year 
      FROM DETALLE D INNER JOIN FACTURA F ON F.NUMERO = D.NUMERO
      WHERE MONTH(F.Fecha) = 5 AND YEAR(F.Fecha) = @year 
      GROUP BY F.CIUDAD, YEAR(F.FECHA)
      ORDER BY SUM(D.VALOR)
    FETCH NEXT FROM tmp_cursor INTO @year
END
CLOSE tmp_cursor 
DEALLOCATE tmp_cursor 
-- Mostramos los resultados de la tabla temporal ordenada por lo que queremos (podríamos volver a filtrar o hacer más operaciones aquí)
SELECT * from @resultados_tmp order by anyo

Seguro que con subconsultas o con vistas enlazadas se puede resolver de forma más simple pero es lo que se me ha ocurrido de primeras para resolverlo.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas