Ver Mensaje Individual
  #2 (permalink)  
Antiguo 29/01/2012, 17:57
Avatar de gnzsoloyo
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, 2 meses
Puntos: 2658
Respuesta: Query Inventario

Hacer ese cálculo, donde trabajas con dos canales de datos distintos (venta y entrega se relacionan, pero no componen la misma cadena de dependencias), implica realizar operaciones intermedias que no puedes juntar en una misma.
Cuando lo haces, cuando juntas indiscriminadamente una operación de venta con la entrega del material, terminas refiriéndote al mismo producto dos veces: Una vez cuando sumas la venta y otra cuando sumas la entrega... Por eso se produce un producto cartesiano.
Cuando trabajas en BBDD tienes que tener en cuenta la lógica de las dependencias, y la lista de productos entregados se relaciona con la lista de productos vendidos por sus cabeceras de definición (Venta y Entrega), no por sus detalles sumados.
Es un poco difícil de ver cuando no has estudiado algo de álgebra de Boole y de álgebra relacional.
La idea es que debes hacer las dos consultas por separado en el from, y luego hacer el JOIN de los resultados, no de las tablas base:
Código MySQL:
Ver original
  1.     p.id,
  2.     p.descripcion,
  3.     vendidos,
  4.     IFNULL(entregados, 0) entregados
  5.     (SELECT P.ID, SUM(DV.cant) vendidos, V.idcliente
  6.     FROM poducto P
  7.         INNER JOIN detalleventa DV ON p.ID = DV.idproducto
  8.         INNER JOIN ventas V ON dv.idventa = V.id
  9.     GROUP BY P.ID, V.idcliente) T1
  10.     LEFT JOIN
  11.     (SELECT P.ID, SUM(DE.cant) entregados, E.idcliente
  12.     FROM productos P
  13.         INNER JOIN detalleentrega DE ON p.ID = DE.idproducto
  14.         INNER JOIN entregas E ON DE.identrega = e.id
  15.     GROUP BY P.ID, E.idcliente) T2 ON T1.ID = T2.ID AND T1.idcliente = T2.idcliente
  16.     T1.idcliente = 'C-001';

Por otro lado, la tabla Cliente es innecesaria porque el ID que buscas ya se encuentra en las cabeceras, y esa tabla no agrega ni saca nada.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)