Ver Mensaje Individual
  #2 (permalink)  
Antiguo 12/03/2014, 05:01
quimfv
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 2 meses
Puntos: 574
Respuesta: Comparar ventas años anteriores

No dices que hay que hacer con el campo sección?
Tampoco entiendo porque conviertes la fecha, si tiene formato DATE, o DATETIME, la puedes usar directamente.

Por secciones

Código MySQL:
Ver original
  1. SELECT MONTH(t1.fecha),
  2. DAY(t1.fecha),
  3.              t1.seccion,
  4.              t1.importe Real,
  5.              t2.importe Prev,
  6.              t3.importe AnioAnt,
  7.              (t1.importe/t2.importe)*100 RealSPrev,
  8.              (t1.importe/t3.importe)*100 RealSAnioAnt
  9. FROM (tabla1 t1 INNER JOIN tabla2 t2
  10.                ON MONTH(t1.fecha)=MONTH(t2.fecha)
  11.                      AND DAY(t1.fecha)=DAY(t2.fecha)
  12.                      AND t1.seccion=t2.seccion)
  13.                           INNER JOIN tabla3 t3
  14.                ON MONTH(t1.fecha)=MONTH(t3.fecha)
  15.                      AND DAY(t1.fecha)=DAY(t3.fecha)
  16.                      AND t1.seccion=t3.seccion;

Sumado

Código MySQL:
Ver original
  1. SELECT MONTH(t1.fecha),
  2. DAY(t1.fecha),  
  3.              SUM(t1.importe) Real,
  4.              SUM(t2.importe) Prev,
  5.              SUM(t3.importe) AnioAnt,
  6.              (SUM(t1.importe)/SUM(t2.importe))*100 RealSPrev,
  7.              (SUM(t1.importe)/SUM(t3.importe))*100 RealSAnioAnt
  8. FROM (tabla1 t1 INNER JOIN tabla2 t2
  9.                ON MONTH(t1.fecha)=MONTH(t2.fecha)
  10.                      AND DAY(t1.fecha)=DAY(t2.fecha)
  11.                      AND t1.seccion=t2.seccion)
  12.                           INNER JOIN tabla3 t3
  13.                ON MONTH(t1.fecha)=MONTH(t3.fecha)
  14.                      AND DAY(t1.fecha)=DAY(t3.fecha)
  15.                      AND t1.seccion=t3.seccion
  16. GROUP BY MONTH(t1.fecha),
  17. DAY(t1.fecha);

(Estoy suponiendo que tienes sumadas las ventas diarias y por secciones)

Lo normal seria partir de dos tablas

Ventas
idVenta
fecha
seccion
idCliente
....

DetalleVenta
idDetVenta
idVenta
idProducto
cantidad
pvp
...

A partir de esa estructura se puede construir dos vistas que den las ventas de el año actual y del año anterior respectivamente. Con lo que obtienes los datos directamente de lo que los ha producido, las ventas individuales, sin guardar datos calculados en ninguna tabla.

Código MySQL:
Ver original
  1. CREATE VIEW VentasActual
  2. SELECT  v.fecha,
  3.              v.seccion,
  4.              SUM(d.cantidad*d.pvp)
  5. FROM ventas v INNER JOIN DetalleVenta d
  6.         ON v.idVenta=d.idVenta
  7. WHERE YEAR(v.fecha)=YEAR(NOW())
  8. GROUP BY v.fecha,
  9.              v.seccion;

Ejecutando esto una vez ya tienes un objeto llamado "VentasActual" que siempre dara las ventas del año actual sea el que sea y que se comporta exactamente igual que una tabla sin serlo (para querys SELECT.... no para las otras)

Mas... la previsión, dudo que se trabaje con algo tan fino como previsiones diarias, pero si es el caso esa tabla serviria. Tambien podrias trabajar con una tabla de previsiones continua para distintos ejecicios y implementar una tercera vista con las previsiones del año actual.

La solución que te he dado para las tablas serviria para las vistas que te suguiero, cambiando tablas por las vistas equivalentes.

Planteatelo es una estrutura más correcta y sobre todo segura.
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 12/03/2014 a las 05:38