Ver Mensaje Individual
  #4  
Antiguo 16-12-2011
Avatar de AzidRain
[AzidRain] AzidRain is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Córdoba, Veracruz, México
Posts: 2.914
Reputación: 21
AzidRain Va camino a la fama
Gracias por el aporte, de hecho la solución del hilo ya la había probado y en efecto funciona la pega es que consume demasiado tiempo ya que contiene subqueries, de las cuales no soy muy adepto por eso.

Les platico en que consiste la consulta que me pidieron.


Tenemos una tabla "talones" que contiene n campos, pero solo nos interesan 3: "sucursal","fecha","importe".

La consulta debe obtener la facturacion mensual de una o todas las sucursales durante un año determinado indicando el % de aumento de decremento de cada mes contra el mes anterior (excepto enero) y además el mismo % pero del mes contra el mes del año anterior. Debe aparece un año en cada fila, algo mas o menos así:

Código SQL [-]
                                            Enero                                                         Febrero
  Año -----  Facturación  % Cr. Mensual   % Cr. vs Año anterior   Facturación  % Cr. Mensual   % Cr. vs Año anterior   .... etc.

Los % de crecimiento mensuales no tienen problema se sacan con campos calculados y listo, el problema era comparar cada mes contra el mismo mes del año anterior o lo que es lo mismo, cada campo "facturacion" contra el mismo campo de la fila inmediata anterior.

Al final, lo resolví de la manera chapucera, pero que me dió mejor rendimiento en velocidad, cargo el query sin el % de aumento anual y posteriormente mediante un procedimiento, recorro los campos y calculo los valores, como si se tratara de una vil matriz.

Aquí mi query chapucero:
Código SQL [-]
select year(fecha) as anio, sucursales.NOMBRE as n_sucursal,
sum( if(month(talones.fecha)=1,if(:flete is null,subtotal,flete),0)) as enero,
0.00 as dif_a_enero,
sum( if(month(talones.fecha)=2,flete,0)) as febrero,
0.00 as dif_a_febrero,
sum( if(month(talones.fecha)=3,if(:flete is null,subtotal,flete),0)) as marzo,
0.00 as dif_a_marzo,
sum( if(month(talones.fecha)=4,if(:flete is null,subtotal,flete),0)) as abril,
0.00 as dif_a_abril,
sum( if(month(talones.fecha)=5,if(:flete is null,subtotal,flete),0)) as mayo,
0.00 as dif_a_mayo,
sum( if(month(talones.fecha)=6,if(:flete is null,subtotal,flete),0)) as junio,
0.00 as dif_a_junio,
sum( if(month(talones.fecha)=7,if(:flete is null,subtotal,flete),0)) as julio,
0.00 as dif_a_julio,
sum( if(month(talones.fecha)=8,if(:flete is null,subtotal,flete),0)) as agosto,
0.00 as dif_a_agosto,
sum( if(month(talones.fecha)=9,if(:flete is null,subtotal,flete),0)) as septiembre,
0.00 as dif_a_septiembre,
sum( if(month(talones.fecha)=10,if(:flete is null,subtotal,flete),0)) as octubre,
0.00 as dif_a_octubre,
sum( if(month(talones.fecha)=11,if(:flete is null,subtotal,flete),0)) as noviembre,
0.00 as dif_a_noviembre,
sum( if(month(talones.fecha)=12,if(:flete is null,subtotal,flete),0)) as diciembre,
0.00 as dif_a_diciembre,
sum(if(:flete is null,subtotal,flete)) as t_total,
0.00 as dif_a_total
from talones
join sucursales on (sucursales.SUCURSAL=talones.SUCURSAL)
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 anio

La chapuza que hice fue "crear" campos de la nada en el query con valores 0.00 que son los que posteriormente lleno a pie mediante código recorriendo cada columna correspondiente y haciendo el cálculo, al final si bien es mas trabajo, el resultado es muchísimo más rápido que la consulta con subconsultas. Afortunadamente Zeos permite modificar campos del query aun siendo compuestos como en este caso, por lo que me salió mejor que crear un Dataset en memoria, copiar del query y luego trabajar con él. No cabe duda que deja uno un rato Delphi y como que se oxida el cerebro.
__________________
AKA "El animalito" ||Cordobés a mucha honra||
Responder Con Cita