Ver Mensaje Individual
  #10  
Antiguo 19-12-2011
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.410
Reputación: 22
fjcg02 Va camino a la fama
Hola,
os adjunto un ejemplo de lo que he comentado. Es conceptual. Esto se podría combinar con una ventana en la que se vaya haciendo zoom, ya que seguramente no entren todos los datos en una pantalla: de años a trimestres, de trimestres a meses, ...
Es importante valorar qué es lo que se quiere poner en filas y columnas, ya que habrá que acotar, no cabe todo en la hoja, aunque se ponga apaisada.
Lo que tu cliente puede necesitar es el TAM (tendencia anual móvil). Es el % de aumento o decremento del año con respecto al año del mes anterior. Es decir, cuanto más o menos he vendido/cobrado/soportado cada mes respecto del periodo de 12 meses anterior. Igual con esas le llevas a tu terreno, que esa información cabe en una sola hoja.

Código SQL [-]
select sucursales.NOMBRE as n_sucursal,
/* MESES */
sum( if(BI.MES=1,if(:flete is null,subtotal,flete),0)) as enero,
sum( if(BI.MES=2,if(:flete is null,subtotal,flete),0)) as febrero,
sum( if(BI.MES=3,if(:flete is null,subtotal,flete),0)) as marzo,
sum( if(BI.MES4,if(:flete is null,subtotal,flete),0)) as abril,
sum( if(BI.MES=5,if(:flete is null,subtotal,flete),0)) as mayo,
sum( if(BI.MES=6,if(:flete is null,subtotal,flete),0)) as junio,
sum( if(BI.MES=7,if(:flete is null,subtotal,flete),0)) as julio,
sum( if(BI.MES=8,if(:flete is null,subtotal,flete),0)) as agosto,
sum( if(BI.MES=9,if(:flete is null,subtotal,flete),0)) as septiembre,
sum( if(BI.MES=10,if(:flete is null,subtotal,flete),0)) as octubre,
sum( if(BI.MES=11,if(:flete is null,subtotal,flete),0)) as noviembre,
sum( if(BI.MES=12,if(:flete is null,subtotal,flete),0)) as diciembre,
sum(if(:flete is null,subtotal,flete)) as t_total,

/* TRIMESTRES */
sum( if(BI.TRIMESTRE=1,if(:flete is null,subtotal,flete),0)) as "TRIMESTRE 1",
sum( if(BI.TRIMESTRE=2,if(:flete is null,subtotal,flete),0)) as "TRIMESTRE 2",
sum( if(BI.TRIMESTRE=3,if(:flete is null,subtotal,flete),0)) as "TRIMESTRE 3",
sum( if(BI.TRIMESTRE=4,if(:flete is null,subtotal,flete),0)) as "TRIMESTRE 4",

/* TRIMESTRES AÑO ANTERIOR */
sum( if(BI.ANIOANTERIOR=YEAR(talones.Fecha)-1 AND BI.TRIMESTRE=1,if(:flete is null,subtotal,flete),0)) as "TRIMESTRE 1 AÑO ANTERIOR",
sum( if(BI.ANIOANTERIOR=YEAR(talones.Fecha)-1 AND BI.TRIMESTRE=2,if(:flete is null,subtotal,flete),0)) as "TRIMESTRE 2  AÑO ANTERIOR",
sum( if(BI.ANIOANTERIOR=YEAR(talones.Fecha)-1 AND BI.TRIMESTRE=3,if(:flete is null,subtotal,flete),0)) as "TRIMESTRE 3  AÑO ANTERIOR",
sum( if(BI.ANIOANTERIOR=YEAR(talones.Fecha)-1 AND BI.TRIMESTRE=4,if(:flete is null,subtotal,flete),0)) as "TRIMESTRE 4  AÑO ANTERIOR",

from talones
join sucursales on (sucursales.SUCURSAL=talones.SUCURSAL)
join BI on ( talones.fecha=BI.fecha)
where (talones.cancelado is null or talones.CANCELADO=0) and (talones.SUSTITUCION is null or talones.SUSTITUCION=0) //Algunas facturas no deben considerarse en la suma
and year(fecha)>2000 
and (talones.sucursal=:sucursal or :sucursal is null)  //Aquí indicamos la sucursal o bien null si queremos todas
group by sucursales.NOMBRE

Respecto del ejemplo, ten en cuenta lo siguiente:
- No es normal incluir meses, trimestres, ... pero es para ilustrar el ejemplo.
- he quitado el año de las filas. Lo normal es que se calcule un año con referencia del año anterior.
- para que funcione, tienes que tener la tabla BI, con un registro por fecha ( 365 registros por año ). Si no lo haces así, no saldrán los resultados, ya que no habrá encuentro de datos.
- Aunque en este ejemplo no se aprecia, cuando son cálculos complejos, se agradece bastante.

Espero que te sirva de ayuda y que te inspire algunas ideas.

Si tienes cualquier duda, me comentas e intentaré ayudarte.

Un saludo
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita