ayuda en una consulta pivot (promedio) sql 2008

marco guti guti
22 de Septiembre del 2018

buenas noches , necesito su ayuda :

le dejo el link de scrip de la base de datos

https://www.dropbox.com/s/auliosb8ald2cq3/dataayuda.sql?dl=0

 

1.- En mostrar todas las estaciones (cdlocal) ,los top 3 mejores consumos (campo total)  algo asi :

 

tengo este avance

select top 3 o.* from ( select EESS,RUC,CLIENTE,AÑO,COALESCE([1], 0) ENE, COALESCE([2], 0) FEB,
COALESCE([3], 0) MAR,COALESCE([4], 0) ABR, COALESCE([5], 0) MAY,
COALESCE([6], 0) JUN,COALESCE([7], 0) JUL,COALESCE([8], 0) AGOS,
COALESCE([9], 0) SEP, COALESCE([10], 0) OCT,
COALESCE([11], 0) NOV, COALESCE([12], 0) DIC,
(COALESCE([1], 0) + COALESCE([2], 0) + COALESCE([3], 0) + COALESCE([4], 0) + COALESCE([5], 0) + COALESCE([6], 0) + COALESCE([7], 0) + COALESCE([8], 0) + COALESCE([9], 0) + COALESCE([10], 0) + COALESCE([11], 0) + COALESCE([12], 0)) as TOTAL
from (select ee.estacion as EESS,cv.ruccliente as RUC,cli.rscliente as CLIENTE,year(cv.fecproceso) as AÑO,month(cv.fecproceso) as Mes,cv.cantidad as Cantidad from cuadredevtas$ cv inner join clientes$ cli on cv.ruccliente = cli.ruccliente inner join eess$ ee on cv.cdlocal = ee.cdlocal) V
PIVOT(sum(Cantidad) FOR Mes IN ([1], [2], [3], [4], [5],[6],[7], [8], [9], [10], [11], [12])) as PT ) as o order by o.EESS,o.TOTAL desc

con esto me sale solo el top 3 de una estacion lo que quiero es que me muestre el top 3 de todas las estaciones como en la imagen ... se podra hacer ?? ... intente de muchas maneras pero no logro hacerlo por favor su ayuda. (en mi consulta de la imagen esta en top 10 me olvide a cambiarlo a top 3 ).


2.-en la imagen se muestra los consumos en galones de enero a diciembre por cliente y al final los totaliza lo que necesito es ahora un promedio que es el consumo total por mes por cliente entre los dias del mes por ejemplo si mi data es del 21/06/2018 al 21/09/2018 con datos ficticios

total de galones /cantidad de dias

cliente 1 :

junio = 850/10=85.000

julio = 1500/31=48.387

agosto = 2500/31=80.645

septiembre = 1200/21 = 57.143

por favor necesito su ayuda me estoy reventando el cerebro tratando de hacerlo lo intente de muchas formas sin embargo no tengo suerte.

 

 

 

 


David Carrero
12 de Agosto del 2026

Hola,

Vamos con la primera parte, el top 3 por estación. El motivo de que solo te salga el top 3 de una única estación es que TOP en SQL Server se aplica sobre todo el resultado ordenado, no «por grupo»: con TOP 3 ... ORDER BY o.EESS, o.TOTAL desc lo que consigues son las 3 filas con el TOTAL más alto de toda la tabla, que casualmente pertenecen todas a la misma estación si esa estación domina el ranking global.

TOP no soporta PARTITION BY, pero ROW_NUMBER() sí, que es la herramienta correcta para «top N por grupo»:

SELECT * FROM (
    SELECT o.*, ROW_NUMBER() OVER (PARTITION BY o.EESS ORDER BY o.TOTAL DESC) AS rn
    FROM (
        -- aqui va tu misma subconsulta con el PIVOT, sin el TOP
        SELECT EESS, RUC, CLIENTE, AÑO, TOTAL
        FROM (/* tu bloque con el PIVOT tal cual lo tienes */) AS pivote
    ) o
) resultado
WHERE rn <= 3
ORDER BY EESS, TOTAL DESC;

ROW_NUMBER() OVER (PARTITION BY o.EESS ORDER BY o.TOTAL DESC) numera las filas del 1 en adelante, reiniciando la numeración en cada estación distinta. Filtrando después por rn <= 3 obtienes exactamente los 3 mejores de cada estación, no los 3 mejores globales.

Para la segunda parte, el promedio por días del mes, la idea es dividir cada total mensual entre el número de días reales de ese mes con DAY(EOMONTH(fecha)) (te da el último día del mes, que coincide con el número de días que tiene), o si necesitas el rango exacto de fechas de tu consulta (no el mes completo), calcula DATEDIFF(day, fecha_inicio, fecha_fin) + 1 para ese mes concreto y divide el total entre ese número. En ambos casos, asegúrate de convertir a DECIMAL o FLOAT antes de dividir, si no la división entre enteros te va a truncar los decimales del promedio.

David Carrero