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

ayuda_consulta

Estas en el tema de ayuda_consulta en el foro de Mysql en Foros del Web. Buenas tengo un problema y no sabría como arreglarlo ya que lo quiero hacer solo con consulta Mysql, bueno primero tengo que realizar un kardex ...
  #1 (permalink)  
Antiguo 17/07/2013, 16:41
 
Fecha de Ingreso: junio-2012
Mensajes: 31
Antigüedad: 11 años, 9 meses
Puntos: 0
ayuda_consulta

Buenas tengo un problema y no sabría como arreglarlo ya que lo quiero hacer solo con consulta Mysql, bueno primero tengo que realizar un kardex en el cual tengo q mostrar varios campos.

En toda la consulta voy bien mi gran problema es en la parte en la que tengo que sumar los campos por cantidad(en los cuales están separado por 2 tipos INGRESO Y SALIDA y cada uno tiene que ir en un campo de la fila) el problema es ahí ya que no sabría como agruparlo , por que ademas ya agrupe por producto ya que si no se repetirían.

gracias de antemano abajo les dejo la consulta.

Código MySQL:
Ver original
  1. p.id_linea,
  2. p.id_familia,
  3. p.id_producto,
  4. p.UND,
  5. p.descripcion,
  6. stki.stock,
  7. sum(if(ma.tip_movimiento='INGRESO',ma.cantidad,'0'))as ingresos, /*aca es donde   quiero agrupar*/
  8. sum(if(ma.tip_movimiento='SALIDA',ma.cantidad,'0')) as salidas,/*aca también esdonde   quiero agrupar*/
  9.  p.stock_minimo,
  10.  p.stock_maximo,
  11.  l.nom_linea,
  12.  fa.nom_familia  
  13.  FROM producto p
  14.  LEFT JOIN stock_inicial stki ON stki.id_producto=p.id_producto
  15.  LEFT JOIN movimiento_almacen ma ON ma.id_producto=p.id_producto
  16.  LEFT JOIN lineas l ON l.id_linea=p.id_linea
  17.  LEFT JOIN familia fa ON fa.id_linea=p.id_linea
  18.  GROUP BY  p.id_producto,ma.tip_movimiento
  19.  ORDER BY  p.id_linea,p.id_familia,p.id_producto ASC

Última edición por wesquer; 17/07/2013 a las 16:46
  #2 (permalink)  
Antiguo 17/07/2013, 17:08
Avatar de 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, 4 meses
Puntos: 2658
Respuesta: ayuda_consulta

El uso de LEFT JOIN en una consulta en estrella es proclive a crear productos cartesianos, y por ende a generar enormes errores de cálculo.


Y agrupar una consulta que tiene sumatorias... te dará malos resultados.
Habría que verificar si existen dependencias transitivas, por que eso ayudaría muchísimo a evitar el problema.
Pero sin ver la estructura de las tablas, la consulta no alcanza para sabe eso.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 18/07/2013, 09:44
 
Fecha de Ingreso: junio-2012
Mensajes: 31
Antigüedad: 11 años, 9 meses
Puntos: 0
Respuesta: ayuda_consulta

Bueno aca te pongo la estructura de las tablas que relaciono gracias.



Código MySQL:
Ver original
  1. PRODUCTO
  2. id_tipo_almacen     varchar(2) 
  3. id_linea                        varchar(3) 
  4. id_familia                      varchar(3) 
  5. id_producto             varchar(10)     PRI
  6. marca                   varchar(11)
  7. descripcion             varchar(68)
  8. precio_costo_1      decimal(10,2)  
  9. precio_costo_2      decimal(10,2)  
  10. precio_costo_3      decimal(10,2)  
  11. precio_venta                decimal(10,2)  
  12. stock                   int(4)     
  13. stock_minimo                int(3)     
  14. stock_maximo                int(4) 
  15. UND                         varchar(3) 
  16. estado                  varchar(5) 
  17.  
  18. STOCK INICIAL
  19. id_producto             varchar(10)     PRI
  20. stock                    int(4)    
  21. precio_costo_2       decimal(10,2) 
  22. fecha_inicio                 date      
  23. fecha_cierre                 date      
  24.  
  25. MOVIMIENTO ALMACEN
  26. id_movimiento               int(11)         PRI     auto_increment
  27. id_producto            varchar(11) 
  28. id_compra              varchar(11) 
  29. id_credito                     varchar(11) 
  30. id_guia                varchar(11) 
  31. cantidad                        int(11)    
  32. precio_venta                double(10,2)   
  33. tip_ingreso             varchar(12)
  34. tip_salida                      varchar(12)
  35. fecha_movimiento             date      
  36. tip_movimiento      varchar(12)
  37. precio_costo_1      decimal(10,2)  
  38. precio_costo_2      decimal(10,2)  
  39. precio_costo_3      decimal(10,2)  
  40.  
  41.  
  42. LINEAS
  43. id_linea                         varchar(3)     PRI
  44. nom_linea                 text     
  45. estado                    int(1)       
  46.  
  47.  
  48. FAMILIA
  49. id_linea                        varchar(3) 
  50. cod_familia             varchar(3) 
  51. nom_familia             varchar(49)
  52. estado                   int(1)

Última edición por gnzsoloyo; 18/07/2013 a las 11:17 Razón: DIficil de visualizar
  #4 (permalink)  
Antiguo 18/07/2013, 16:44
Avatar de 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, 4 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)
  #5 (permalink)  
Antiguo 19/07/2013, 08:35
 
Fecha de Ingreso: junio-2012
Mensajes: 31
Antigüedad: 11 años, 9 meses
Puntos: 0
Respuesta: ayuda_consulta

hola claro todo esta bien la pate de GROUP BY `p`.`id_producto`,`ma`.`tip_movimiento`
el `ma`.`tip_movimiento` le puse para ver como sale si le pongo asi no logre borrarlo pero cuando lo puse así se repite 2 veces el código pero la agrupación de los ingresos y egresos esta bien son exactos a los que deseo pero lo malo es que esta en 2 filas 1 fila de ingresos y otra de egresos pero cuando le quito el GROUP BY `p`.`id_producto`,`ma`.`tip_movimiento` y solo le pongo GROUP BY `p`.`id_producto`me sale todos los productos sin repetir pero con las cifras que no son.

Lo que pienso es que si se puede agrupar los productos ("se agrupa por que en el movimiento de almacén se puede repetir el producto varias veces ya que varios clientes pueden comprar el mismo producto ") y dentro de esa poder sumar bien si son ingresos( pude ser ingresos si el cliente devuelve el producto o bien hay una compra) o si bien son egresos(cuando hay una venta) esa es la forma en la que quisiera mostrarlo. gracias
  #6 (permalink)  
Antiguo 19/07/2013, 09:01
Avatar de 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, 4 meses
Puntos: 2658
Respuesta: ayuda_consulta

Cita:
cuando le quito el GROUP BY `p`.`id_producto`,`ma`.`tip_movimiento` y solo le pongo GROUP BY `p`.`id_producto`me sale todos los productos sin repetir pero con las cifras que no son.
Postea una muestra del resultado en ambos casos, porque no se comprende a qué diferencias te refieres.
Cita:
("se agrupa por que en el movimiento de almacén se puede repetir el producto varias veces ya que varios clientes pueden comprar el mismo producto ")
No estás agrupando por cliente, así que el dato se debería consolidar sin problemas. Tu reporte es por producto, no por operación. Son conceptos distintos que no se pueden combinar porque son contradictorios.
Para hacer una consolidación de conceptos no compatibles la consulta es mucho más compleja y con subconsultas incluidas.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: campo, 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 02:35.