Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Comparar ventas años anteriores

Estas en el tema de Comparar ventas años anteriores en el foro de Mysql en Foros del Web. Buenos días, estoy haciendo un pequeño Dashboard para reportar ventas sobre año anterior y sobre previsiones. Para ello tengo 3 tablas, donde en una pongo ...
  #1 (permalink)  
Antiguo 12/03/2014, 04:18
 
Fecha de Ingreso: marzo-2009
Mensajes: 20
Antigüedad: 15 años, 2 meses
Puntos: 2
Comparar ventas años anteriores

Buenos días, estoy haciendo un pequeño Dashboard para reportar ventas sobre año anterior y sobre previsiones.

Para ello tengo 3 tablas, donde en una pongo los datos reales del año, en otra las previsiones y en otra el dato del año anterior.

Me gustaría poder realizar una consulta donde me mostrara el resultado por día. Algo así.

FECHA| REAL | PREV | AÑO ANT

01/01 | 100 | 105 | 110 | 105% | 110 %
....

Para ello, convierto la fecha a un número para poder relacionar las 3 tablas: 01/01/2014 lo convierto a 101.
Tengo montado algo con vistas pero es muy estático, y me gustaría crea una vista donde me muestre los datos por día, con sus porcentajes sobre ventas.

Por poner un ejemplo básico lo tendría de la siguiente manera:

Tabla 1: ventas Real año en curso
-fecha_convertida
-seccion
-importe

Tabla 2: ventas previstas
-fecha_convertida
-seccion
-importe

Tabla 3: ventas año anterior
-fecha_convertida
-seccion
-importe


No sé si me he explicado bien...

Muchas gracias de antemano

Un saludo!
  #2 (permalink)  
Antiguo 12/03/2014, 05:01
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
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
  #3 (permalink)  
Antiguo 12/03/2014, 05:11
Avatar de Djoaq  
Fecha de Ingreso: septiembre-2012
Ubicación: Barcelona
Mensajes: 271
Antigüedad: 11 años, 7 meses
Puntos: 38
Respuesta: Comparar ventas años anteriores

Cita:
Iniciado por txerife Ver Mensaje

Para ello, convierto la fecha a un número para poder relacionar las 3 tablas: 01/01/2014 lo convierto a 101.

Un saludo!
Hola . yo no soy de los mas expertos por aquí , te diría que mysql tiene sus propios recursos para las fechas ... no debes hacer este tipo de conversiones ..

Hay 3 recursos que deberías tener en cuenta :

1: sentencia between ...
ejemplo :
Código MySQL:
Ver original
  1. SELECT * FROM tutablaWHERE fecha BETWEEN '2012-01-16' AND '2012-10-16'

con between puedes seleccionar rangos de fechas directamente

2: funcion date_format() esta funcion te permite formatear la fecha en formato americano , en formato largo corto .. etc..

[URL="http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_date-format"]http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_date-format[/URL]

3: con la sentencia UNION de myslq puedes concatenar consultas ejemplo :

Código MySQL:
Ver original
  1. Select dato1 from tabla where Condicion = "hola"
Código MySQL:
Ver original
  1. Select dato2 from tabla where Condicion = "hola2"
Código MySQL:
Ver original
  1. Select dato3 from tabla where Condicion = "hola3"

Y la salida seria :

Hola
Hola2
Hola3
[URL="http://dev.mysql.com/doc/refman/5.0/es/union.html"]http://dev.mysql.com/doc/refman/5.0/es/union.html[/URL]

Luego lo de sacar datos por días ... no lo entiendo muy bien .. Vas a guardar en las tablas todos los días?? o te refieres que quieres que la consulta se ejecute a diario? No entiendo muy bien ...

Si es la segunda opción .. la consulta se calcularía cada vez q la ejecutes si aplicas la lógica matemática que necesitas , la lógica de búsqueda de rangos de fechas , las relaciones y las concatenaciones de resultados.

Podrías poner un muestreo de como son tus tablas?


Saludos!
  #4 (permalink)  
Antiguo 13/03/2014, 04:17
 
Fecha de Ingreso: marzo-2009
Mensajes: 20
Antigüedad: 15 años, 2 meses
Puntos: 2
Respuesta: Comparar ventas años anteriores

Muchas gracias a ambos. La verdad es que las reconversiones que hacía era por ignorancia. Anduve intentando con fechas y al no conseguirlo pensé en un plan B, aún sabiendo que estaba haciendo una aberración jeje

He probado la consulta como comentó quimfv y me puede servir. Eso sí, al hacer la consulta sobre vistas me realentiza bastante. He optimizado poniendo los tipos de datos más ajustados y he ganado en rapidez pero no suficiente.

Realmente tengo 3 tablas:
- Ventas del año. Aquí guardo los datos diarios por centro, sección, y tipo de ventas. Con lo que el total del año me saldría en torno al millón de líneas.
- Previsión del año: datos por sección.
- Ventas año anterior: mismo formato que el año en curso.

Realmente en las ventas del año tengo muchos más datos de los que necesito para la comparación entre las 3 tablas, pero los guardo para otras consultas sobre la tabla.

A ver si saco un rato y pongo la estructura de las tablas.

Otro caso que quiero hacer es el acumulado diario. En su día anduve buscando algo de información y probé con funciones dentro de la consulta.
Es decir:

Día 1: 10 € -> Acum: 10 €
Día 2: 15 € -> Acum: 25 €

etc.

Muchas gracias por vuestro tiempo.

Un saludo

Etiquetas: anteriores, tabla, ventas
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:06.