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

[SOLUCIONADO] conflicto con agrupar columnas con dos fechas distintas

Estas en el tema de conflicto con agrupar columnas con dos fechas distintas en el foro de Mysql en Foros del Web. Hola buena noche, primero que nada, en serio que el curso y sus ejemplos explicativos son muy buenos, ayudan a mejorar el rendimiento y entender ...
  #1 (permalink)  
Antiguo 08/11/2013, 23:20
 
Fecha de Ingreso: noviembre-2009
Mensajes: 6
Antigüedad: 15 años, 1 mes
Puntos: 0
conflicto con agrupar columnas con dos fechas distintas

Hola buena noche, primero que nada, en serio que el curso y sus ejemplos explicativos son muy buenos, ayudan a mejorar el rendimiento y entender mucho como funciona mejor las peticiones sql a la base.

hoy presento un problema que tengo, para ver si me pueden ayudar por favor, hace ya un buen rato cree una base con una tabla pagos así:
Código MySQL:
Ver original
  1. CREATE TABLE `pagos` (
  2. `MONTO` float(8,2) unsigned NOT NULL,
  3. `MORA` float(5,2) DEFAULT '0.00',
  4. `PAGO` float(8,2) DEFAULT '0.00',
  5. `FECHA_PAGO` date DEFAULT NULL,
  6. `BOLETA` int(10) unsigned DEFAULT NULL,
  7. `FECHA_MORA` date DEFAULT NULL,
  8. `USUARIO` varchar(20) DEFAULT NULL,

y ahora que intento sacar un consolidado por día no puedo resolver la consulta

lo que deseo es que me quede en un rango por ejemplo: del 01-11-2013 al 05-11-2013 el total pagado.

fecha | monto | mora | total
01-11-13 100.00 20.00 120.00
02-11-13 100.00 35.00 135.00
03-11-13 500.00 50.00 550.00
04-11-13 0.00 10.50 10.50
05-11-13 200.00 0.00 200.00

la siguiente consulta me muestra el total del monto
Código MySQL:
Ver original
  1. SELECT FECHA_PAGO, SUM(MONTO)
  2. FROM pagos
  3. WHERE (FECHA_PAGO BETWEEN '2013/11/01' AND '2013/11/05')
  4. GROUP BY FECHA_PAGAR
y esta otra me muestra el total de mora
Código MySQL:
Ver original
  1. SELECT FECHA_MORA, SUM(MORA)
  2. FROM pagos
  3. WHERE (FECHA_MORA BETWEEN '2013/11/01' AND '2013/11/05')
  4. GROUP BY FECHA_MORA

pero cuando quiero convertirla en una sola no he podido, pues si coloco la fecha_pago las condiciones de rango y agrupación hacen que las moras salgan en la fecha del pago, y no en la verdadera fecha de la mora que esta guardada en fecha_mora, ya intente pero en verdad gracias por leerlo y si pueden ayudarme muy agradecido

espero haberme dado a entender, bendiciones

Última edición por gnzsoloyo; 09/11/2013 a las 02:34
  #2 (permalink)  
Antiguo 09/11/2013, 10:45
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 8 meses
Puntos: 300
Respuesta: conflicto con agrupar columnas con dos fechas distintas

No lo he probado, pero intenta con esto:

Código MySQL:
Ver original
  1. SELECT SUM(t1.tot) total FROM  ((SELECT FECHA_PAGO fecha, SUM(MONTO) tot
  2.     FROM pagos
  3.     WHERE FECHA_PAGO BETWEEN '2013/11/01' AND '2013/11/05'
  4.     GROUP BY FECHA_PAGAR)
  5.        UNION ALL
  6.     (SELECT FECHA_MORA, SUM(MORA)
  7.     FROM pagos
  8.     WHERE FECHA_MORA BETWEEN '2013/11/01' AND '2013/11/05'
  9.     GROUP BY FECHA_MORA))t1

Última edición por jurena; 09/11/2013 a las 11:13
  #3 (permalink)  
Antiguo 09/11/2013, 13:27
 
Fecha de Ingreso: noviembre-2009
Mensajes: 6
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: conflicto con agrupar columnas con dos fechas distintas

Gracias por tu tiempo jurena, quizá no me di a entender, probé tu solución y me da el total de todo, pero lo necesito con las fechas y demás columnas así:

https://docs.google.com/drawings/d/1Nbj0Z0y-MGwxaYsrEB65_m-7CwIQjbnwQ12vuxlX-qo/pub?w=480

hice dos pruebas
Código MySQL:
Ver original
  1. #PRUEBA1
  2.  
  3. SELECT fecha_pagar, SUM(MONTO) MENSUAL,
  4.  SUM(mora)  mora, SUM(pago) AS total FROM pagos WHERE fecha_pagar BETWEEN
  5. '2013/11/01' AND '2013/11/04' GROUP BY fecha_pagar ORDER BY fecha_pagar DESC
  6.  
  7. #PRUEBA2  FALTA EL TOTAL PERO SOLO ERA PRUEBA
  8.  
  9. SELECT   FECHA_PAGAR,
  10. SUM(IF(FECHA_PAGAR BETWEEN '2013/11/01' AND '2013/11/05', MONTO,NULL)) "MENSUAL",
  11. SUM(IF(FECHA_MORA BETWEEN '2013/11/01' AND '2013/11/05', MORA,NULL)) "MORA"
  12. FROM       PAGOS  
  13. WHERE FECHA_PAGAR BETWEEN '2013/11/01' AND '2013/11/05'
  14. GROUP BY   FECHA_PAGAR ORDER BY FECHA_PAGAR

La segunda prueba es una transpuesta pero el error sigue, porque los 20 de mora en la primer tabla, realmente se pagaron en la fecha 2013-11-03 pero como selecciono fecha_pagar desde el inicio por ello lo agrupa en 04-11 que es del pago. es decir que debería haber quedado como la tabla 2.

gracias nuevamente por su tiempo

Última edición por gnzsoloyo; 10/11/2013 a las 06:23
  #4 (permalink)  
Antiguo 09/11/2013, 14:01
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 8 meses
Puntos: 300
Respuesta: conflicto con agrupar columnas con dos fechas distintas

No lo he probado, pero intenta tú a ver qué sale. Observa que lo primero es sacar las distintas fechas mediante union, luego con left join uno a la misma tabla dos veces una por la fecha de pago y otra por la de mora.
Código MySQL:
Ver original
  1. SELECT t1.fecha, IFNULL(SUM(p.MONTO),'0') monto, IFNULL(SUM(p.MORA),'0') MORA FROM  ((SELECT DISTINCT FECHA_PAGO fecha
  2.         FROM pagos
  3.         WHERE FECHA_PAGO BETWEEN '2013/11/01' AND '2013/11/05')
  4.            UNION
  5.         (SELECT DISTINCT FECHA_MORA
  6.         FROM pagos
  7.         WHERE FECHA_MORA BETWEEN '2013/11/01' AND '2013/11/05'))t1 LEFT JOIN pagos p ON t1.fecha = p.FECHA_PAGO LEFT JOIN pagos p2 t1.fecha = p2.FECHA_MORA GROUP BY t1.fecha
  #5 (permalink)  
Antiguo 09/11/2013, 18:54
 
Fecha de Ingreso: noviembre-2009
Mensajes: 6
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: conflicto con agrupar columnas con dos fechas distintas

de nuevo gracias pero aun descuadra, te he tomado la idea, y he observado, que es por lo mismo: de p, jalamos el monto, y de p2 (hice el cambio) jalo las moras, porque si las selecciono de p, aparece en fecha equivocada, pero estoy analizando que me ha duplicado un monto donde hay fecha_mora únicamente y el total de ambas columnas si lo jalo de p, no cuadra.

asi lo tengo por el momento.

Código MySQL:
Ver original
  1. SELECT t1.fecha, IFNULL(SUM(p.MONTO),0) monti,
  2. IFNULL(SUM(p2.MORA),0) mori, IFNULL(SUM(p2.pago),0) tot  FROM  
  3. ((SELECT DISTINCT FECHA_PAGAR fecha
  4.         FROM pagos
  5.         WHERE FECHA_PAGAR BETWEEN '2013/11/01' AND '2013/11/05')
  6.            UNION
  7.         (SELECT DISTINCT FECHA_MORA fecha
  8.         FROM pagos
  9.         WHERE FECHA_MORA BETWEEN '2013/11/01' AND '2013/11/05'))t1  LEFT JOIN pagos p ON t1.fecha = p.FECHA_PAGAR LEFT JOIN pagos p2 ON t1.fecha = p2.FECHA_MORA GROUP BY t1.fecha ORDER BY t1.FECHA DESC

seguiré analizando por la noche y hablamos luego y gracias de nuevo por tu valioso tiempo
  #6 (permalink)  
Antiguo 10/11/2013, 02:34
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 8 meses
Puntos: 300
Respuesta: conflicto con agrupar columnas con dos fechas distintas

Nos has proporcionado el create table y el ejemplo de salida, pero no a partir de qué datos debe darse esa salida. Una exportación de algunos datos para insertar, de los que nos proporcionaras la salida esperada serían de gran utilidad. Pero hasta entonces prueba esto:
Código MySQL:
Ver original
  1. SELECT t1.fecha, IFNULL( SUM( p.PAGO ) , 0 ) pagi, IFNULL( SUM( p2.MORA ) , 0 ) mori, IFNULL( SUM( p.PAGO ) , 0 ) + IFNULL( SUM( p2.MORA ) , 0 ) toti
  2. (
  3.  
  4. SELECT DISTINCT FECHA_PAGO fecha
  5. FROM pagos
  6. WHERE FECHA_PAGO
  7. BETWEEN '2013/11/01'
  8. AND '2013/11/05'
  9. )
  10.  
  11. SELECT DISTINCT FECHA_MORA fecha
  12. FROM pagos
  13. WHERE FECHA_MORA
  14. BETWEEN '2013/11/01'
  15. AND '2013/11/05'
  16. )
  17. )t1
  18. LEFT JOIN pagos p ON t1.fecha = p.FECHA_PAGO
  19. LEFT JOIN pagos p2 ON t1.fecha = p2.FECHA_MORA
  20. GROUP BY t1.fecha
  21. ORDER BY t1.FECHA DESC
  #7 (permalink)  
Antiguo 10/11/2013, 06:43
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: conflicto con agrupar columnas con dos fechas distintas

Recapitulemos:
Cita:
pero cuando quiero convertirla en una sola no he podido, pues si coloco la fecha_pago las condiciones de rango y agrupación hacen que las moras salgan en la fecha del pago, y no en la verdadera fecha de la mora que esta guardada en fecha_mora, ya intente pero en verdad gracias por leerlo y si pueden ayudarme muy agradecido
Básicamente lo que sucede es que tienes dos subconsultas incompatibles entre sí. Eso hace bastante complicado poder lograr un reporte consolidado de deudas, pagos y moras.

A mi entender, están bastante próximos, pero habría que tratar de simplificar la cosa, y yo lo haría con uso de IF, mas o menos así:
Código MySQL:
Ver original
  1.     SUM(IF(FECHA_PAGO BETWEEN '2013/11/01' AND '2013/11/05', monto, 0)) total_pagos,
  2.     SUM(IF(FECHA_MORA BETWEEN '2013/11/01' AND '2013/11/05', mora, 0)) total_mora,
  3.     SUM(monto+mora) total
  4. FROM  pagos
  5.     FECHA_PAGO BETWEEN '2013/11/01' AND '2013/11/05'
  6.     OR
  7.     FECHA_MORA BETWEEN '2013/11/01' AND '2013/11/05'
  8. GROUP BY FECHA_PAGO;
una consulta así cumpliria sin problemas con los datos necesarios para crear esto:
Cita:
lo que deseo es que me quede en un rango por ejemplo: del 01-11-2013 al 05-11-2013 el total pagado.

fecha | monto | mora | total
01-11-13 100.00 20.00 120.00
02-11-13 100.00 35.00 135.00
03-11-13 500.00 50.00 550.00
04-11-13 0.00 10.50 10.50
05-11-13 200.00 0.00 200.00
porque en ese ejemplo que diste, la fecha de mora es un problema interno del sistema, y no debe ser representado dentro del reporte.
Digo esto último porque lo que quieres saber en esa síntesis es lo pagado en cada deuda, en referencia a que lo que importa en ese caso es la deuda origen y su mora posible, y no a partir de cuándo se aplico la carga de mora.

Ahora bien, entendamos que en general el modelo de esa tabla no es muy correcto desde la optica de sistemas para administrar pagos y moras, porque hay un error conceptual: Pagos son todos los ingresos de importes abonados por cualquier medio aceptable, y por cualquier concepto. En ese sentido, una MORA, es un concepto de pago, aplicado sobre una DEUDA de cuenta, pero no es importe adeudado en cuenta.
Visto así, la tabla de deudas debería contener fecha de ingreso, importe y fecha de vencimiento.
La tabla de Pagos debería contener, por lo menos, id de la cuenta adeudada, importe abonado, fecha de pago y concepto. Y probablemente yo construiría una tabla de "conceptos de pago", para completar la idea y darle flexibilidad al sistema.

Con un modelo mejor armado, en otras palabras, tu consulta se volvería muchísimo más simple.

Espero que se entienda lo que intento plantear.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 10/11/2013, 10:35
 
Fecha de Ingreso: noviembre-2009
Mensajes: 6
Antigüedad: 15 años, 1 mes
Puntos: 0
Información Respuesta: conflicto con agrupar columnas con dos fechas distintas

buen día jurena te envio una pequeña copia de la tabla con datos sql acá,

[URL="https://skydrive.live.com/?cid=ee661027ae7f1fb8&id=EE661027AE7F1FB8%21107&au thkey=!"]https://skydrive.live.com/?cid=ee661027ae7f1fb8&id=EE661027AE7F1FB8%21107&au thkey=![/URL]

( y gracias moderador criollo por involucrarte pero la fecha es una columna importante que debe ser agregada)

Código HTML:
Ver original
  1. <iframe src="https://skydrive.live.com/embed?cid=EE661027AE7F1FB8&resid=EE661027AE7F1FB8%21107&authkey=AGx0kCwinjX4UYE" width="98" height="120" frameborder="0" scrolling="no"></iframe>

espero que hoy si el contexto ayude

descripcion campos:
pago: guarda total pagado
mora: se genera o re-calcula automáticamente, sube 10 cada 6 de mes con un sp.
fecha_pago: es la fecha ultima para pagar sin mora (por error el primer post se fue con esa fecha que no interesa en la consulta de ahorita, pero he hecho el cambio en cada una de sus sugerencias)
fecha_pagar: es la fecha en que se efectúa el pago normal o mensual,
fecha_mora: es la fecha en que se efectúa el pago de la mora únicamente.

avances: agregue un campo morapag, donde guarda la mora que ya fue pagada, porque el campo mora se genera o re-calcula automáticamente, excede la fecha limite de pago.

pensaba entonces que el total necesitará un if para saber si hay moras pagadas, que le reste al pago total la mora pagada, pero si no tiene moras pagadas que solo sume el campo pago, (esto para la columna total)

bueno sigo analizando con ustedes y muchas gracias por atender.

Última edición por enniogt; 10/11/2013 a las 10:39 Razón: se me fue, aplicar en embebido ya no lo pude editar
  #9 (permalink)  
Antiguo 10/11/2013, 11:06
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 8 meses
Puntos: 300
Respuesta: conflicto con agrupar columnas con dos fechas distintas

Yo, como @gnzsoloyo, también tengo mis dudas sobre la estructura de tu tabla. Pero antes te haré una pregunta sobre tus datos de salida
Cita:
fecha | monto | mora | total
01-11-13 100.00 20.00 120.00
02-11-13 100.00 35.00 135.00
03-11-13 500.00 50.00 550.00
04-11-13 0.00 10.50 10.50
05-11-13 200.00 0.00 200.00
Cuando muestras la fecha, qué fecha es esa para cada columna. Dinos el campo correspondiente en la tabla para MONTO y para MORA. ¿Se trata de FECHA_PAGAR y FECHA_MORA, respectivamente.
¿Quieres sacar sumados los montos de cada fecha, dentro del rango de fechas buscadas, donde haya montos; y también las moras de cada fecha de ese mismo rango, sumadas por fecha, y luego la suma total, no?
  #10 (permalink)  
Antiguo 10/11/2013, 11:27
 
Fecha de Ingreso: noviembre-2009
Mensajes: 6
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: conflicto con agrupar columnas con dos fechas distintas

si así es como lo planteas, si escribo puedo confundir, tal como lo plateas y los campos son así.

fecha, todas las del rango
monto =la suma de todo lo pagado con fecha_pagar sobre el monto
mora = la suma de todo lo pagado con fecha_mora sobre morapag, (pues es la que ya esta pagada)
y el total siempre en su respectivo rango

pudieron descargar el ejemplo, los datos del ejemplo estan en el cliente 024
  #11 (permalink)  
Antiguo 10/11/2013, 11:31
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 8 meses
Puntos: 300
Respuesta: conflicto con agrupar columnas con dos fechas distintas

a ver si esta te vale:
Código MySQL:
Ver original
  1. SELECT t1.fecha, IFNULL(SUM( t1.monto ),0) monto, IFNULL(SUM( t1.mora ),0) mora, SUM( t1.monto ) + SUM( t1.mora ) TOTAL
  2. (
  3.  
  4. SELECT FECHA_PAGAR fecha, id, monto, '' mora
  5. FROM pagos
  6. WHERE FECHA_PAGAR
  7. BETWEEN '2013/11/01'
  8. AND '2013/11/05'
  9. )
  10.  
  11. SELECT FECHA_MORA, id, '' monto, mora
  12. FROM pagos
  13. WHERE FECHA_MORA
  14. BETWEEN '2013/11/01'
  15. AND '2013/11/05'
  16. )
  17. )t1
  18. GROUP BY t1.fecha

Última edición por jurena; 10/11/2013 a las 11:39
  #12 (permalink)  
Antiguo 10/11/2013, 11:57
 
Fecha de Ingreso: noviembre-2009
Mensajes: 6
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: conflicto con agrupar columnas con dos fechas distintas

gracias jurena, por todo tu tiempo, yo habia colocado morapag, por si no pagan la totalidad de la mora, sino una parte nomás, pero no se que dices, y eso de ' ' mora, cual es la idea exactamente, leeré gracias de nuevo
  #13 (permalink)  
Antiguo 10/11/2013, 12:03
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 8 meses
Puntos: 300
Respuesta: conflicto con agrupar columnas con dos fechas distintas

me traigo vacío como valor para esos campos en esos SELECT dentro del UNION ALL. De hecho, si aceptas NULL, quizás hubiera sido mejor traerse NULL. Creo que esta consulta sería mejor. De hecho, he corregido también la suma del total, para evitar que la suma de algo con NULL dé NULL. Ahí va la última
Código MySQL:
Ver original
  1. SELECT t1.fecha, IFNULL( SUM( t1.monto ) , 0 ) monto, IFNULL( SUM( t1.mora ) , 0 ) mora, IFNULL(SUM( t1.monto ),0) + IFNULL(SUM( t1.mora ),0) TOTAL
  2. (
  3.  
  4. SELECT FECHA_PAGAR fecha, id, monto, NULL mora
  5. FROM pagos
  6. WHERE FECHA_PAGAR
  7. BETWEEN '2013/11/01'
  8. AND '2013/11/05'
  9. )
  10.  
  11. SELECT FECHA_MORA, id, NULL monto, mora
  12. FROM pagos
  13. WHERE FECHA_MORA
  14. BETWEEN '2013/11/01'
  15. AND '2013/11/05'
  16. )
  17. )t1
  18. GROUP BY t1.fecha

Etiquetas: agrupar, columnas, conflicto, distintas, select, sql, 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 14:34.