none
Utilizar SUM para obtener total de entradas/salidas movimientos inventario RRS feed

  • Pregunta

  • Hola,

    Tengo la siguiente consulta con la cual obtengo correctamente los movimientos que se fueron realizando al inventario, 
    por cualquier concepto, es decir, factura, traspaso, ajuste, etc.

    Lo que necesito es ahora la sumatoria para solo obtener en cada fila el total de entradas y salidas de cada producto.

    Esta es la consulta:

    SELECT CAST(mov.CFECHA AS DATE) AS FECHA,
      mov.CIDMOVIMIENTO,
      prod.CCODIGOPRODUCTO,
      prod.CNOMBREPRODUCTO,
      alm.CNOMBREALMACEN,
      mov.CUNIDADES,
      mov.CAFECTAEXISTENCIA /* 2-Salida 1-Entrada */
      FROM admMovimientos mov
      JOIN admAlmacenes alm ON alm.cIdAlmacen = mov.cIdAlmacen
      JOIN admProductos prod ON prod.cIdProducto = 
      mov.cIdProducto  
      WHERE mov.cFecha BETWEEN '20181001' AND '20181015' AND 
      mov.cAfectaExistencia <> 3
      ORDER BY FECHA

    Y este es lo que obtengo:


    Pero quiero obtener algo como esto:


    La clave es la columna CAFECTAEXISTENCIA, por eso estoy intentando el CASE, si CAFECTAEXISTENCIA =1 es una entrada, si CAFECTAEXISTENCIA = 2 es una salida, pero no estoy obteniendo los resultados deseados, al no saber cómo aplicar correctamente la condición en el SUM, así lo estoy intentando.

    SUM( CASE WHEN mov.CAFECTAEXISTENCIA = 1 THEN mov.CUNIDADES ELSE 0 END) AS [TOTAL_ENTRADAS],

    Me pueden dar algunas ideas por favor cómo obtener lo que se requiere.

    Gracias.

    Saludos,
    Javier
    domingo, 30 de diciembre de 2018 20:55

Respuestas

Todas las respuestas

  • Prueba con este comando

    SELECT CAST(mov.CFECHA AS DATE) AS FECHA,
      mov.CIDMOVIMIENTO,
      prod.CCODIGOPRODUCTO,
      prod.CNOMBREPRODUCTO,
      alm.CNOMBREALMACEN,
      mov.CUNIDADES,
      mov.CAFECTAEXISTENCIA /* 2-Salida 1-Entrada */,
      sUM( CASE WHEN mov.CAFECTAEXISTENCIA = 1 THEN mov.CUNIDADES ELSE 0 END) AS [TOTAL_ENTRADAS]
       over (order by fecha)
      FROM admMovimientos mov
      JOIN admAlmacenes alm ON alm.cIdAlmacen = mov.cIdAlmacen
      JOIN admProductos prod ON prod.cIdProducto = 
      mov.cIdProducto  
      WHERE mov.cFecha BETWEEN '20181001' AND '20181015' AND 
      mov.cAfectaExistencia <> 3
      ORDER BY FECHA
    


    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    • Propuesto como respuesta HunchbackMVP miércoles, 2 de enero de 2019 14:07
    lunes, 31 de diciembre de 2018 8:14
    Moderador
  • Deleted
    martes, 1 de enero de 2019 0:05
  • Hola José,

    Muchas gracias, esto ha funcionado según lo requerido, tengo un par de dudas..., por qué utilizar el where en la CTE y no fuera de la definición de la CTE?, caso concreto, si quiero filtrar solo por un producto, cómo aplicar el where?.

    Y la otra duda es similar, si se requiere utilizar algún otro join para unir con otras tablas, lo debo considerar dentro de la definición de la CTE o fuera?.

    Gracias.

    Saludos,
    Javier

    • Editado jparada miércoles, 2 de enero de 2019 4:52
    miércoles, 2 de enero de 2019 4:52
  • No es necesaria en absoluto en este caso , se usa exclusivamente por dejar el código más fácil de leer. 

    puedes poner el filtro dentro de la CTE o escribir el group by completo y no afectar al resultado

    Evalua también si quieres o no sacar los productos sin movimientos (usando un left join en lugar de un inner join)


    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    miércoles, 2 de enero de 2019 7:39
    Moderador
  • Deleted
    miércoles, 2 de enero de 2019 9:45
  • Hola José,

    Muy agradecido con tus amplias explicaciones y tu gran ayuda, voy a realizar algunas 
    pruebas con todas estas indicaciones que me has dado.

    Gracias por tu ayuda.

    Saludos,
    Javier
    • Editado jparada sábado, 5 de enero de 2019 2:12
    sábado, 5 de enero de 2019 2:12