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

[SOLUCIONADO] como genero esta consulta en MySQL para una tabla de movimienos de almacen

Estas en el tema de como genero esta consulta en MySQL para una tabla de movimienos de almacen en el foro de Mysql en Foros del Web. Hola a todos! Aprovecho este primer post para presentarme y hacer una consulta. En primer lugar decir que no me dedico profesionalmente a la programacion ...
  #1 (permalink)  
Antiguo 25/09/2015, 04:49
 
Fecha de Ingreso: septiembre-2015
Mensajes: 7
Antigüedad: 8 años, 6 meses
Puntos: 0
como genero esta consulta en MySQL para una tabla de movimienos de almacen

Hola a todos!
Aprovecho este primer post para presentarme y hacer una consulta. En primer lugar decir que no me dedico profesionalmente a la programacion pero si suelo desarrollar pequeñas aplicaciones para uso interno. Hasta ahora solia programar en visual Basic y utilizaba access como base de datos, pero a partir de este año he empezado con visual studio y MySql de un modo muy amateur.

Ahora estoy desarrollando una pequeña aplicacion que gestiona los movimientos de almacen y me surge la siguiente duda:

Quiero tener en una tabla el codigo de articulo, la suma de las cantidades en entrada y la suma de las cantidades en salida de ese articulo y otra columna con la diferencia entre ambas para obtener el stock.

La SQL que hago es la siguiente:
Código SQL:
Ver original
  1. SELECT codigo_articulo,SUM(cantidad) AS SALIDAS FROM mov_almacen
  2. WHERE fecha_mov>"2015-08-31"
  3. AND codigo_mov IN
  4. (SELECT codigo FROM mot_movimientos WHERE tipo_mov='S' AND estado='0')
  5. GROUP BY codigo_articulo

Con esta SQL obtengo todas la suma de las unidades que han salido de cada articulo pero no se como hacer para que me aparezcan las entradas y la diferencia entre ambas.

Para ello cuento con estas dos tablas:

La tabla de movimientos de almacen:
Código MySQL:
Ver original
  1. CREATE TABLE mov_almacen (
  2. id_mov_almacen      INTEGER     NOT NULL    DEFAULT '0'/*AUTO_INCREMENT*/,
  3. fecha_mov       DATE        NOT NULL    DEFAULT '0000-00-00',
  4. codigo_cliente      VARCHAR(10) NOT NULL    DEFAULT '',
  5. codigo_articulo     VARCHAR(15) NOT NULL    DEFAULT '',
  6. codigo_mov      VARCHAR(2)  NOT NULL    DEFAULT '',
  7. cantidad        INTEGER     NOT NULL    DEFAULT '0',
  8. codigo_almacen      VARCHAR(2)  NOT NULL    DEFAULT '',
  9. codigo_almacen_D    VARCHAR(2)  NOT NULL    DEFAULT '',
  10. comentario      VARCHAR(70) NOT NULL    DEFAULT '',
  11. estado          VARCHAR(1)  NOT NULL    DEFAULT '0',
  12. fecha_cierre        DATE        NOT NULL    DEFAULT '0000-00-00',
  13. mov_de_cierre       INTEGER     NOT NULL    DEFAULT 0,
  14. mov_que_cierra      INTEGER     NOT NULL    DEFAULT 0,
  15. /*
  16. mov_anterior        INTEGER     NOT NULL    DEFAULT '0',
  17. */
  18. precio_mov      DECIMAL(15,2)   NOT NULL    DEFAULT '0.00',
  19. PRIMARY KEY (id_mov_almacen),
  20. FOREIGN KEY (codigo_cliente) REFERENCES clientes (codigo) ON UPDATE CASCADE,
  21. FOREIGN KEY (codigo_articulo) REFERENCES articulos (codigo) ON UPDATE CASCADE,
  22. FOREIGN KEY (codigo_mov) REFERENCES mot_movimientos (codigo) ON UPDATE CASCADE,
  23. FOREIGN KEY (codigo_almacen) REFERENCES almacenes (codigo) ON UPDATE CASCADE,
  24. FOREIGN KEY (codigo_almacen_D) REFERENCES almacenes (codigo) ON UPDATE CASCADE
  25. )

Y la tabla de motivos de movimientos;
Código MySQL:
Ver original
  1. CREATE TABLE mot_movimientos (
  2. codigo      VARCHAR(2)  NOT NULL, #'Código del movimiento clave primaria
  3. tipo_mov    VARCHAR(1)  NOT NULL, #'Tipo de movimiento puede ser E(Entrada);S(Salida)
  4. descripcion VARCHAR(30) NOT NULL, #'Descripción del tipo de movimiento
  5. n_disp      VARCHAR(1)  NOT NULL, #'Como incide el movimiento en el stock no disponible (-,+,=)
  6. a_dev       VARCHAR(1)  NOT NULL, #'Como incide el movimiento en el stock a devolver (-,+,=)
  7. estado      VARCHAR(1)  NOT NULL, #'Estado del movimiento (0=Cerrado,1=abierto,2=cierra uno abierto)
  8. PRIMARY KEY (codigo)
  9. )

Última edición por gnzsoloyo; 25/09/2015 a las 05:25 Razón: Código sin etiquetar
  #2 (permalink)  
Antiguo 25/09/2015, 07:42
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, 7 meses
Puntos: 774
Respuesta: como genero esta consulta en MySQL para una tabla de movimienos de almacen

seria algo como esto:


Código SQL:
Ver original
  1. SELECT salidas,entradas,salidas-entradas AS diferenci, codigo_cliente FROM(
  2. SELECT SUM(salidas) AS salidas,SUM(entradas) AS entradas, codigo_cliente FROM(
  3. SELECT CASE WHEN tipo_mov='S' THEN SUM(cantidad) END AS salidas,
  4. CASE WHEN tipo_mov='E' THEN SUM(cantidad) END AS entradas, codigo_cliente
  5. FROM mov_almacen AS t1
  6. LEFT JOIN mot_movimientos  AS t2 ON (t1.codigo_mov=t2.codigo)
  7. ) AS t3
  8. GROUP BY codigo_cliente
  9. ) AS t4
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 26/09/2015, 08:38
 
Fecha de Ingreso: septiembre-2015
Mensajes: 7
Antigüedad: 8 años, 6 meses
Puntos: 0
Respuesta: como genero esta consulta en MySQL para una tabla de movimienos de almacen

Gracias Libras!
creo que he aprendido mas de SQl con tu sentencia que en el año que llevo con ello.
La estoy probando pero hay algo que falla, cuando sepa decirte el que, te lo comento.
  #4 (permalink)  
Antiguo 26/09/2015, 12:46
 
Fecha de Ingreso: septiembre-2015
Mensajes: 7
Antigüedad: 8 años, 6 meses
Puntos: 0
Respuesta: como genero esta consulta en MySQL para una tabla de movimienos de almacen

Hola de nuevo!

Como he comentado en el mail anterior la SQL fallaba y ahora he conseguido saber donde.

Para saber donde no es correcto, he ejecutado por partes el código de la SQL de la siguiente manera.

Código MySQL:
Ver original
  1. SELECT codigo_articulo,
  2. CASE WHEN tipo_mov='E' THEN SUM(cantidad) END AS entradas
  3. FROM mov_almacen LEFT JOIN mot_movimientos
  4. ON codigo_mov=codigo
  5. GROUP BY codigo_articulo;

El resultado es que me da la suma total de todas las entradas y salidas, es decir si he tenido un movimiento de entrada con una cantidad de 5 unidades y varias salidas por un total de 4, tengo en la columna 'entradas' 9.

Por el contrario con esta parte del codigo

Código MySQL:
Ver original
  1. SELECT codigo_articulo,
  2. CASE WHEN tipo_mov='S' THEN SUM(cantidad) END AS salidas
  3. FROM mov_almacen LEFT JOIN mot_movimientos
  4. ON codigo_mov=codigo
  5. GROUP BY codigo_articulo;

En la columna 'salidas' tengo valores NULL

No sé cómo seguir afinando la consulta, a ver si me pueden seguir ayudando.

Gracias de antemano!
  #5 (permalink)  
Antiguo 27/09/2015, 12:04
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, 7 meses
Puntos: 774
Respuesta: como genero esta consulta en MySQL para una tabla de movimienos de almacen

isnull, busca para que funciona y como aplicarlo
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #6 (permalink)  
Antiguo 28/09/2015, 00:43
 
Fecha de Ingreso: septiembre-2015
Mensajes: 7
Antigüedad: 8 años, 6 meses
Puntos: 0
Respuesta: como genero esta consulta en MySQL para una tabla de movimienos de almacen

Ok, gracias!
Me pongo con ello a ver que tal.
  #7 (permalink)  
Antiguo 29/09/2015, 09:58
 
Fecha de Ingreso: septiembre-2015
Mensajes: 7
Antigüedad: 8 años, 6 meses
Puntos: 0
Respuesta: como genero esta consulta en MySQL para una tabla de movimienos de almacen

Más o menos ya lo tengo, todavia tengo que trabajarlo algo más.
Lo que si quiero es darte las gracias porque con tu respuestas me has abierto un abanico de posibilidades para poder aplicar que desconocia del lenguaje SQL.

Gracias y un saludo

Etiquetas: fecha, select, sql, tabla
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 03:03.