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

[SOLUCIONADO] Consulta me duplica datos

Estas en el tema de Consulta me duplica datos en el foro de Mysql en Foros del Web. Hola. Espero que podais ayudarme con esta consulta SQL. Es para un programa de gestión de expedientes de morosos. Cada expediente tiene uno o varios ...
  #1 (permalink)  
Antiguo 17/01/2016, 10:27
Avatar de Lecquio  
Fecha de Ingreso: mayo-2004
Ubicación: Asturias, España
Mensajes: 948
Antigüedad: 20 años
Puntos: 34
Consulta me duplica datos

Hola. Espero que podais ayudarme con esta consulta SQL.

Es para un programa de gestión de expedientes de morosos.
Cada expediente tiene uno o varios contrarios (o morosos)
Cada vez que un contrario hace un pago se mete un apunte en el expediente que incluye: fecha, cantidad y concepto.
Los conceptos siempre son iguales. Pongamos A, B, C y D para simplificar.

Un ejemplo:
Expediente: 12345
Contrario1: Paco
Contrario2: Manolo
------Fecha--------------------Concepto----------------Cantidad
Pago1: 01/01/2016--------------A-----------------------5€
Pago2: 02/01/2016--------------A-----------------------10€
Pago3: 08/01/2016--------------B-----------------------30€
Pago4: 15/01/2016--------------B-----------------------40€

Necesito una consulta que me muestre la suma de las cantidades según el concepto.
Debería devolverme esto:

Expediente: 12345
Contrario: Paco
----------Cantidad----Concepto
Pago1: ----15€---------A
Pago3: ----70€---------B

El problema es que también necesito que me muestre el contrario, y cuando el mismo expediente tiene 2 contrarios, pues repite los resultados, o me suma 2 veces las cantidades, según como lo agrupe. Con las pruebas que estoy haciendo ahora me salen esto:

Expediente: 12345
Contrario: Paco
----------Cantidad----Concepto--Contrario
Pago1: ----15---------A---------Paco
Pago3: ----70---------B---------Paco
Pago1: ----15---------A---------Manolo
Pago3: ----70---------B---------Manolo

o Esto (fijaos que duplica las cantidades)
Expediente: 12345
Contrario: Paco
----------Cantidad----Concepto--Contrario
Pago1: ----30---------A---------Paco
Pago3: ----140--------B---------Paco

¿Cómo puedo evitar esto? Con que salga uno de los 2 contrarios me sirve.
La estructura de la BD:

expedien (nexp): contiene el número de expediente
pagos(nexp,npagos): relaciona el expediente con los pagos
linpag(npagos,descripcio,concepto,fecha,cantidad): contiene los datos de los pagos
conexp(nexp,ncon): relacion los contrarios con el expediente
contra(ncon,nombre): contiene los datos del contrario


La consulta que tengo hasta ahora es esta:
Código SQL:
Ver original
  1. SELECT expedien.nexp,linpag.descripcio,linpag.concepto,SUM(linpag.cantidad),contra.nombre
  2. FROM expedien
  3. LEFT JOIN pagos ON expedien.nexp=pagos.nexp
  4. LEFT JOIN linpag ON pagos.npagos=linpag.npagos
  5. LEFT JOIN conexp ON expedien.nexp=conexp.nexp
  6. LEFT JOIN contra ON conexp.ncon=contra.ncon
  7. WHERE (linpag.fecha > CAST("2016/01/01" AS DATE))
  8. GROUP BY linpag.concepto, contra.nombre
Me funciona si solo hay un contrario en el expediente pero si hay varios pasa lo que comenté antes, que varía en funciona de si pongo o quito el group by contra.nombre.
¿Cómo puedo solucionarlo?
Gracias de antemano.

Última edición por gnzsoloyo; 17/01/2016 a las 11:09
  #2 (permalink)  
Antiguo 17/01/2016, 17:27
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Consulta me duplica datos

Si te fijas bien en tu consulta no repite datos, porque porque tienes 2 valores diferentes:

----------Cantidad----Concepto--Contrario
Pago1: ----15---------A---------Paco
Pago3: ----70---------B---------Paco

estos son registros diferentes, no iguales porque el concepto y cantidad son diferentes aunque sean del mismo nombre si quieres hacer la consulta como dices que aparezca un nombre podrias discriminar tu resultada obteniendo nada mas el que tenga fecha maxima :)

Código MySQL:
Ver original
  1. SELECT expedien.nexp,linpag.descripcio,linpag.concepto,SUM(linpag.cantidad),contra.nombre
  2. FROM expedien
  3. LEFT JOIN pagos ON expedien.nexp=pagos.nexp
  4. LEFT JOIN linpag ON pagos.npagos=linpag.npagos
  5. LEFT JOIN conexp ON expedien.nexp=conexp.nexp
  6. LEFT JOIN contra ON conexp.ncon=contra.ncon
  7. left join (select max(fecha), concepto from expediente group by concepto) as nueva on (linpag.fecha=nueva.fecha and linpag.concepto=nueva.concepto)
  8. WHERE (linpag.fecha > CAST("2016/01/01" AS DATE))
  9. GROUP BY linpag.concepto, contra.nombre
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 18/01/2016, 10:33
Avatar de Lecquio  
Fecha de Ingreso: mayo-2004
Ubicación: Asturias, España
Mensajes: 948
Antigüedad: 20 años
Puntos: 34
Respuesta: Consulta me duplica datos

Sí me lo duplica, porque los pagos son al expediente, no por contrario.
Si hay 50€ pagados a un expediente con 3 contrarios, me devuelve:
contrario1 50€
contrario2 50€
contrario3 50€

Y debería devolver solo: contrario1 50€ (o cualquier contrario, eso no me preocupa)

Con tu consulta me salía lo mismo que en mi primer ejemplo, pero me dió una idea y parece que me salió así:
Código SQL:
Ver original
  1. SELECT expedien.nexp,linpag.descripcio,linpag.pagosa,SUM(linpag.pagos_e),contra.nombcon
  2. FROM expedien
  3. LEFT JOIN pagos ON expedien.nexp=pagos.nexp
  4. LEFT JOIN linpag ON pagos.npagos=linpag.npagos
  5. LEFT JOIN (SELECT nexp, ncon FROM conexp GROUP BY nexp) AS nueva ON (expedien.nexp=nueva.nexp)
  6. LEFT JOIN contra ON nueva.ncon=contra.ncon
  7. WHERE (linpag.fecha > CAST("2016/01/01" AS DATE))
  8. GROUP BY linpag.pagosa, contra.nombcon
[/CODE]

Última edición por gnzsoloyo; 18/01/2016 a las 11:05

Etiquetas: fecha, join, select, sql
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:58.