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

[SOLUCIONADO] Consulta acumulada por fecha

Estas en el tema de Consulta acumulada por fecha en el foro de Mysql en Foros del Web. Buenos días, Tengo la siguiente tabla: Id Unidad Gasto Fecha ----------------------------------------------------------- 1 Unidad 1 25000 2013-02-01 1 Unidad 1 15000 2013-02-02 1 Unidad 1 10000 ...
  #1 (permalink)  
Antiguo 29/04/2013, 01:45
 
Fecha de Ingreso: septiembre-2006
Mensajes: 139
Antigüedad: 17 años, 7 meses
Puntos: 14
Consulta acumulada por fecha

Buenos días,

Tengo la siguiente tabla:

Id Unidad Gasto Fecha
-----------------------------------------------------------
1 Unidad 1 25000 2013-02-01
1 Unidad 1 15000 2013-02-02
1 Unidad 1 10000 2013-02-03

2 Unidad 2 55000 2013-02-01
2 Unidad 2 78000 2013-02-02
2 Unidad 2 19000 2013-02-03

3 Unidad 3 32000 2013-02-01
3 Unidad 3 35000 2013-02-02
3 Unidad 3 40000 2013-02-03


¿Cómo podría obtener el acumulado entre los días 1 y 3 del mes para cada unidad?

He probado con una subconsulta en el campo a acumular pero me acumula el total pero de todas las unidades y ese total se los pone a todas las unidades.

La sentencia que uso es:

SELECT unidades.Id, unidades.Unidad, (SELECT SUM(unidades.Gasto) FROM unidades WHERE unidades.Fecha >= “2013-02-01” AND unidades.Fecha <= “2013-03-03”) as GastoAcumulado FROM unidades;


Gracias de antemano.

Saludos cordiales.
Francisco J.
  #2 (permalink)  
Antiguo 29/04/2013, 03:04
Avatar de Developando  
Fecha de Ingreso: abril-2013
Mensajes: 48
Antigüedad: 11 años
Puntos: 5
Respuesta: Consulta acumulada por fecha

select SUM(unidades.gasto) from unidades where unidades.Fecha >= “2013-02-01” AND unidades.Fecha <= “2013-03-03”) GROUP BY unidades.Unidad;

Prueba a utilizar el parámetro GROUP BY para agrupar los resultados que te devuelve según necesites
  #3 (permalink)  
Antiguo 29/04/2013, 04:00
 
Fecha de Ingreso: septiembre-2006
Mensajes: 139
Antigüedad: 17 años, 7 meses
Puntos: 14
Respuesta: Consulta acumulada por fecha

Muchas gracias, justo estaba probándolo. Ahora el problema es que al hacer un JOIN en la consulta general con otra tabla relacionada en relación 1:1 me arroja un error en el que me indica que la subconsulta devuelve más de un valor.

Había pensado hacer un JOIN con la otra tabla y llamar a la tabla del JOIN pero ya tengo dos join con dicha tabla. ¿Cómo podría resolverlo?

¿Cómo puedo crear un alias de tabla y consultarlo dentro de la subconsulta donde hago el acumulado?

Gracias de antemano.

Saludos cordiales.
Francisco J.
  #4 (permalink)  
Antiguo 29/04/2013, 06:11
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Consulta acumulada por fecha

Se están complicando en exceso...
Si lo que quieres es el acumulado gastos, entre el primero y el 3 de cada mes, por cada producto, lo que debes es establecer las condiciones de selección (WHERE) y las de agrupamiento (GROUP BY) según lo que quieres:
- que el día (no la fecha, sino el del mes) esté entre 1 y 3.
- que se agrupen por producto.
- que se agrupen por mes
- que se agrupen por año.

Con eso definido debería quedar mas o menos así:
Código MySQL:
Ver original
  1.     Id,
  2.     Unidad,
  3.     SUM(Gasto) GastoAcumulado
  4. FROM unidades
  5.     DAY(Fecha) BETWEEN 1 AND 3
  6. FROM unidades
  7. GROUP BY Unidad, MONTH(Fecha), YEAR(Fecha);
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 29/04/2013, 06:34
 
Fecha de Ingreso: septiembre-2006
Mensajes: 139
Antigüedad: 17 años, 7 meses
Puntos: 14
Respuesta: Consulta acumulada por fecha

Muchas gracias gnzsoloyo,

El problema lo encuentro cuando hago el join.

Estaba probando ahora la siguiente consulta:
Código MySQL:
Ver original
  1. SELECT UNIDADES.NOMBREUNIDAD, DATOSBASEUNIDAD.SECCIONES, PRODUCCIONUNIDAD.GASTOS,
  2. (SELECT SUM(PRODUCCIONUNIDAD.GASTOS) FROM PRODUCCIONUNIDAD WHERE PRODUCCIONUNIDAD.FECHAPROD >="2013-03-01" AND PRODUCCIONUNIDAD.FECHAPROD <="2013-03-05" GROUP BY PRODUCCIONUNIDAD.FKCODIGO)AS ACUM
  3. FROM UNIDADES
  4. JOIN PRODUCCIONUNIDAD ON UNIDADES.CODIGO= PRODUCCIONUNIDAD.FKCODIGO
  5. JOIN DATOSBASEUNIDAD ON UNIDADES.CODIGO= DATOSBASEUNIDAD.FKCODIGO
  6. WHERE UNIDADES.FKJEFATURA = "ALM01" AND PRODUCCIONUNIDAD.FECHAPROD = "2013-03-05"

Pero me suma todo y lo especifica en cada unidad el mismo valor.

Si agrupo por unidad no me deja porque dice que la subconsulta devuelve más de un valor.

Gracias por tu ayuda.

Saludos cordiales.
Francisco J.

Última edición por gnzsoloyo; 29/04/2013 a las 07:26
  #6 (permalink)  
Antiguo 29/04/2013, 07:31
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Consulta acumulada por fecha

¿Te has dado cuenta que ignoraste completamente el ejemplo que te puse, y persistes con la misma sintaxis que ya habías puesto, y que no te resulta?


En serio, ¿te tomaste el tiempo de comparar la sintaxis que te propongo y ver las diferencias con la tuya?

Porque parece que no.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 29/04/2013, 07:40
 
Fecha de Ingreso: septiembre-2006
Mensajes: 139
Antigüedad: 17 años, 7 meses
Puntos: 14
Respuesta: Consulta acumulada por fecha

Perdona amigo no lo ignoraba solo te expuse como lo hacia. aun no he podido probar porque el equipo de trabajo no lo estoy usando. luego lo pruebo y te confirmo.

muchas gracias y disculpa las molestias.

saludos cordiales.
Francisco J
  #8 (permalink)  
Antiguo 29/04/2013, 08:01
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Consulta acumulada por fecha

OK, cuando pruebes, podemos seguir, porque lo que muestras contiene los mismos defectos y errores.
Código MySQL:
Ver original
  1.     U.NOMBREUNIDAD,
  2.     DU.SECCIONES,
  3.     SUM(PU.GASTOS) ACUM
  4. FROM UNIDADES U
  5.     INNER JOIN PRODUCCIONUNIDAD PU ON U.CODIGO= PU.FKCODIGO
  6.     INNER JOIN DATOSBASEUNIDAD DU ON U.CODIGO = DU.FKCODIGO
  7.     U.FKJEFATURA = 'ALM01'
  8.     AND PU.FECHAPROD = '2013-03-05'
  9. GROUP BY U.CODIGO

- Los rangos de tiempo no están bien expresados. Si el SUM() en el SELECT pide datos entre el 05/03/2013 y el 05/03/2013, en realidad estás pidiendo que sea igual a esa fecha.
- Si estás pidiendo esa fecha en el SELECT, no tiene sentido indicar que sea mayor o igual al 01/05/2013. Eso devuelve datos erróneos porque sumaría conceptos que no pertenecen al rango.
- No tiene sentido poner el campo PU.GASTOS, si lo estás sumando. No será representativo y sólo mostrará el valor correspondiente al primer sumando.
- Es mejor poner explícitamente los INNER del iNNER JOIN, para evitar confusiones.
- Es conveniente usar los alias, para evitar lecturas confusas.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 29/04/2013, 08:37
 
Fecha de Ingreso: septiembre-2006
Mensajes: 139
Antigüedad: 17 años, 7 meses
Puntos: 14
Respuesta: Consulta acumulada por fecha

Te comento un poco más en detalle:

1. Erré en la expresión porque quería decir entre el día 1 y el 5, porque era un ejemplo que estaba haciendo para el día 5, pero en sí, para cualquier día me debería acumular desde el día 1 hasta el día de la consulta. Ej. si consulto el día 28 de marzo, debería acumularme desde el día 1 de marzo hasta el 28 inclusive.

2. Al hacer consultas entre varias tablas en el momento que hago el JOIN me remite diciendo que la subconsulta del acumulado devuelve más de 1 registro.

Voy a probar con tu expresión a ver si logro dar con el resultado.

Gracias nuevamente y disculpa las molestias.

Saludos cordiales.
Francisco J.
  #10 (permalink)  
Antiguo 29/04/2013, 08:53
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Consulta acumulada por fecha

Cita:
. Al hacer consultas entre varias tablas en el momento que hago el JOIN me remite diciendo que la subconsulta del acumulado devuelve más de 1 registro.
Es obvio que te va a responder eso, desde el momento en que estás agrupando en ese subselect.
Un subselect dentro del select debe devolver siempre un único valor de un único registro.
Siempre.

Pero además, los subselect dentro del select son asesinos de performance. Sólo se deben usar si es estrictamente necesario, y no se puede obtener el mismo resultado por otro medio. De lo contrario son la peor idea que existe, junto con el "SELECT *" y el "LIKE '%texto%'".

Cita:
porque era un ejemplo que estaba haciendo para el día 5, pero en sí, para cualquier día me debería acumular desde el día 1 hasta el día de la consulta. Ej. si consulto el día 28 de marzo, debería acumularme desde el día 1 de marzo hasta el 28 inclusive.
En ese caso estás parametrizando mal la consulta. Tu condición de fecha debe construirse para ser dinámica:
Código MySQL:
Ver original
  1.     U.NOMBREUNIDAD,
  2.     DU.SECCIONES,
  3.     SUM(PU.GASTOS) ACUM
  4. FROM UNIDADES U
  5.     INNER JOIN PRODUCCIONUNIDAD PU ON U.CODIGO= PU.FKCODIGO
  6.     INNER JOIN DATOSBASEUNIDAD DU ON U.CODIGO = DU.FKCODIGO
  7.     U.FKJEFATURA = 'ALM01'
  8.     AND PU.FECHAPROD BETWEEN CONCAT(YEAR(CURDATE()), '-', MONTH(CURDATE)), '-', DAY(CURDATE))) AND CURDATE()
  9. GROUP BY U.CODIGO
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #11 (permalink)  
Antiguo 29/04/2013, 09:06
 
Fecha de Ingreso: septiembre-2006
Mensajes: 139
Antigüedad: 17 años, 7 meses
Puntos: 14
Respuesta: Consulta acumulada por fecha

Muchísimas gracias de verdad.

Llevo poco tiempo y he realizado consultas no muy complejas, pero ésta la verdad me está dando bastantes quebraderos de cabeza. Y seguramente no se trate de una consulta complicada pero claro, cuando no se me había dado este caso anteriormente, pues estoy un poco verde.

Pido mil disculpas por mi ignorancia en algunos aspectos.

En cuanto pueda probaré lo que me comentas que seguro que funciona, además analizaré concienzudamente todas las consultas para aprender.

Un cordial saludo.
Francisco J.
  #12 (permalink)  
Antiguo 29/04/2013, 09:12
 
Fecha de Ingreso: septiembre-2006
Mensajes: 139
Antigüedad: 17 años, 7 meses
Puntos: 14
Respuesta: Consulta acumulada por fecha

Conseguido!!!!!

Muchísimas gracias amigo. He aplicado la consulta tal y como me comentaste, con algunas variaciones para obtener datos de otras tablas y ya funciona a la perfección.

Además de MARCAR TEMA COMO SOLUCIONADO ¿hay algo más que pueda darte como puntos o algo?

Te estoy eternamente agradecido.

La verdad a veces nos empeñamos en sacarlo de alguna forma "extraña" cuando era más tema de concepto ... tendré que volver a repasar un poco ...

Mientras, queda mi agradecimiento por delante.

Saludos cordiales.
Francisco J.
  #13 (permalink)  
Antiguo 29/04/2013, 09:18
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Consulta acumulada por fecha

No hay problema. La meta de este sitio es que aprendamos y despuntar el vicio ayudando a otros.

Saludos.



__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #14 (permalink)  
Antiguo 29/04/2013, 09:37
 
Fecha de Ingreso: septiembre-2006
Mensajes: 139
Antigüedad: 17 años, 7 meses
Puntos: 14
Respuesta: Consulta acumulada por fecha

Pues sí, la verdad da gusto encontrar compañeros que estén dispuestos a enseñar.

Por cierto, he incluido el mismo campo que uso para realizar la acumulada como un campo de búsqueda individual y no me devuelve un dato correcto, sino que me devuelve el del primer día del mes para todos los días que hago la consulta, aunque el acumulado sí me lo calcula. Trato de tener un campo con el Gasto del día y otro con el gasto acumulado hasta ese día, pero en cada día me devuelve el valor del día inicial.

Suele ocurrir que cuando consigues una cosa, se suele trastocar otra jajajaja.

Espero algún día poder aportar un poco de lo que sé.

Un saludo.
Francisco J.
  #15 (permalink)  
Antiguo 29/04/2013, 09:44
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Consulta acumulada por fecha

Por lo que entiendo, lo que necesitas es un subtotal por día. Eso se realiza con la misma cláusula GROUP BY, pero con un adicional:
Código MySQL:
Ver original
  1.     U.NOMBREUNIDAD,
  2.     DU.SECCIONES,
  3.     SUM(PU.GASTOS) ACUM
  4. FROM UNIDADES U
  5.     INNER JOIN PRODUCCIONUNIDAD PU ON U.CODIGO= PU.FKCODIGO
  6.     INNER JOIN DATOSBASEUNIDAD DU ON U.CODIGO = DU.FKCODIGO
  7.     U.FKJEFATURA = 'ALM01'
  8.     AND PU.FECHAPROD BETWEEN CONCAT(YEAR(CURDATE()), '-', MONTH(CURDATE)), '-', DAY(CURDATE))) AND CURDATE()
  9. GROUP BY U.CODIGO, PU.FECHAPROD WITH ROLLUP;
Esto crearía el subtotal diario, y un total por artículo.
De lo contrario, para un reporte detallado, deberás plantearte hacerlo combinadamente entre la aplicación y un par de consultas.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #16 (permalink)  
Antiguo 29/04/2013, 09:55
 
Fecha de Ingreso: septiembre-2006
Mensajes: 139
Antigüedad: 17 años, 7 meses
Puntos: 14
Respuesta: Consulta acumulada por fecha

Ups creo que me expliqué mal, necesito algo así:


Id____Unidad____Gasto ____AcumMes____Fecha
1____Unidad 1____25000____25000____2013-03-01
1____Unidad 1____15000____40000____2013-03-02
1____Unidad 1____10000____50000____2013-03-03

2____Unidad 2____55000____55000____2013-03-01
2____Unidad 2____78000____133000____2013-03-02
2____Unidad 2____19000____152000____2013-03-03

3____Unidad 3____32000____32000____2013-03-01
3____Unidad 3____35000____67000____2013-03-02
3____Unidad 3____40000____107000____2013-03-03

Es decir, la unidad con el gasto diario y el acumulado para lo que lleva de mes.

Con lo cual si pido para el día 3 de la Unidad 3 me debería arrojar: 3____Unidad 3____40000____107000____2013-03-03 siendo 107000 el acumulado desde el día 1 de marzo hasta el día 3.

He probado lo que me dices pero me duplica los registros y no me agrupa por codigo y justo antes de aplicarle el último group by no lo hacía.

Saludos.
Francisco J.
  #17 (permalink)  
Antiguo 29/04/2013, 09:57
 
Fecha de Ingreso: septiembre-2006
Mensajes: 139
Antigüedad: 17 años, 7 meses
Puntos: 14
Respuesta: Consulta acumulada por fecha

Perdón pero no me llevo muy bien con las tablas en el foro. Lo digo por el post anterior que parece diseño web del cretácico.
  #18 (permalink)  
Antiguo 29/04/2013, 10:14
 
Fecha de Ingreso: septiembre-2006
Mensajes: 139
Antigüedad: 17 años, 7 meses
Puntos: 14
Respuesta: Consulta acumulada por fecha

Ahora sí parece estar arrojándome el resultado esperado.

En el caso de la columna que quería seleccionar sí he tenido que hacer una subconsulta del siguiente modo:

Código:
SELECT 
    U.NOMBREUNIDAD, 
    DU.SECCIONES, 
    (SELECT PU.GASTOS FROM PRODUCCIONUNIDAD WHERE PRODUCCIONUNIDAD.FECHAPROD = CURDATE() AND PRODUCCIONUNIDAD.FKCODIGO = U.CODIGO)
    SUM(PU.GASTOS) ACUM
FROM UNIDADES U
    INNER JOIN PRODUCCIONUNIDAD PU ON U.CODIGO= PU.FKCODIGO
    INNER JOIN DATOSBASEUNIDAD DU ON U.CODIGO = DU.FKCODIGO
WHERE 
    U.FKJEFATURA = 'ALM01' 
    AND PU.FECHAPROD BETWEEN CONCAT(YEAR(CURDATE()), '-', MONTH(CURDATE)), '-', DAY(CURDATE))) AND CURDATE() 
GROUP BY U.CODIGO;
Así al menos viendo un poco los datos sí parece devolver datos coherentes.

De todos modos voy a ir revisando con distintos días, meses, unidades, ... para ver si funciona.

Saludos y gracias nuevamente.
Francisco J.
  #19 (permalink)  
Antiguo 29/04/2013, 13:16
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Consulta acumulada por fecha

Esta noche lo miro, pero me parece que lo que planteas ahora no es lo mismo que planteabas al inicio.
Se puede hacer, pero la consulta es algo... complicada.
Luego te la paso.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #20 (permalink)  
Antiguo 29/04/2013, 15:34
 
Fecha de Ingreso: septiembre-2006
Mensajes: 139
Antigüedad: 17 años, 7 meses
Puntos: 14
Respuesta: Consulta acumulada por fecha

Gracias amigo.

La verdad, quizás no me expresé bien y de ahí la confusión.

El tema está en que quería extraer tanto el dato del día como el acumulado hasta la fecha para cada unidad. Por eso intentaba hacerlo con subconsultas.

Al final parece que los datos que obtengo usando el código que me facilitaste, junto con una pequeña subconsulta en uno de los SELECTS me arroja resultados que hasta ahora están siendo satisfactorios.

De todos modos mañana me toca un largo día para obtener el resto de datos, si quieres aportar algo más, bienvenido será.

Gracias nuevamente, y sobre todo por tu tiempo y paciencia.

Un cordial saludo.
Francisco J.

Etiquetas: campo, fecha, select, tabla
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 12:06.