Ver Mensaje Individual
  #1 (permalink)  
Antiguo 17/01/2016, 10:27
Avatar de Lecquio
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