Ver Mensaje Individual
  #4 (permalink)  
Antiguo 18/07/2013, 16:44
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: 16 años, 5 meses
Puntos: 2658
Respuesta: ayuda_consulta

Bueno, viendo lo que planteas, vamos a partir de una serie de supuestos (tú dirás si están bien)
1) Todo producto tiene una familia.
2) Todo producto tiene una línea.
3) Todo producto tiene o tuvo un stock incial (no existen productos sin stock, aunque sea cero).
4) Todo producto pudo haber tenido un movimiento de almacén.

Si esos cuatro considerando son reales, debes usar INNER JOIN en las tres primeras condiciones y un LEFT JOIN sólo en la última, y para que sea eficiente, se debe poner el movimiento al final.
Además, no puedes agrupar por ingreso y egreso, eso no tiene sentido, porque estás buscando sumar los ingresos y egresos de los productos. Por lo demás, la consulta está bien.
Lo que sí debo acosnejarte es que nunca jamás pongas cadenas de caracteres en una suma, como hiciste en el IF() del SUM(). Si vas a sumar, debe ser un número, no una cadena. Si el servidor no está habilitado para conversiones implícitas te generará un error de tipo de dato o te devolvería NULL.
La idea es mas o menos así:
Código MySQL:
Ver original
  1.     `p`.`id_linea`,
  2.     `p`.`id_familia`,
  3.     `p`.`id_producto`,
  4.     `p`.`UND`,
  5.     `p`.`descripcion`,
  6.     IFNULL(`stki`.`stock`, 0) stock,
  7.     SUM(if(`ma`.`tip_movimiento` = 'INGRESO', `ma`.`cantidad`, 0)) `ingresos`,
  8.     SUM(if(`ma`.`tip_movimiento` = 'SALIDA', `ma`.`cantidad`, 0))  `salidas`,
  9.     `p`.`stock_minimo`,
  10.     `p`.`stock_maximo`,
  11.     `l`.`nom_linea`,
  12.     `fa`.`nom_familia`
  13.     `producto` `p`
  14.     INNER JOIN `lineas` `l` ON `l`.`id_linea` = `p`.`id_linea`
  15.     INNER JOIN `familia` `fa` ON `fa`.`id_linea` = `p`.`id_linea`
  16.     INNER JOIN `stock_inicial` `stki` ON `p`.`id_producto` = `stki`.`id_producto`
  17.     LEFT JOIN `movimiento_almacen` `ma` ON `ma`.`id_producto` = `p`.`id_producto`
  18. GROUP BY `p`.`id_producto`,`ma`.`tip_movimiento`
  19. ORDER BY `p`.`id_linea`,`p`.`id_familia`,`p`.`id_producto` ASC;

Un detalle más: La próxima vez que se te pida la estructura de las tablas, no uses DESCRIBE. Eso no nos permite ver las dependencias funcionales. Usa mejor SHOW CREATE TABLE:
Código MySQL:
Ver original
  1. SHOW CREATE TABLE producto;
  2. SHOW CREATE TABLE lineas;
  3. SHOW CREATE TABLE familia;
  4. SHOW CREATE TABLE stock_inicial;
  5. SHOW CREATE TABLE movimiento_almacen;
Eso sí devolverá la sentencia de creación.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)