none
Obtener total de productos estén o no en la tabla de ventas RRS feed

  • Pregunta

  • Hola,
    Tengo la siguiente consulta a la tabla productos:

    select ccodigoproducto from admproductos where
    cidvalorclasificacion1 = 1
    and ctipoproducto = 1 and cstatusproducto = 1

    me devuelve 868 productos, lo cual es correcto.

    query_pdtos

    Lo que requiero es obtener de la tabla ventas/movimientos las ventas de todos los productos 
    de la clasificación, es decir, en esta consulta yo esperaría que me regresara los mismos 868 productos

    select pdtos.ccodigoproducto,
    doctos.cfolio, 
    cast(movtos.cfecha as date) as 'fecha', 
     movtos.ctotal
    	from admproductos pdtos
    left outer join admMovimientos as movtos on pdtos.cidproducto = movtos.cidproducto
    inner join admDocumentos as doctos on movtos.ciddocumento = doctos.ciddocumento
    where pdtos.cidvalorclasificacion1 = 1
    and pdtos.ctipoproducto = 1 and pdtos.cstatusproducto = 1
    and movtos.cfecha between '20190606' and '20190606'
    and movtos.cidalmacen = 1
    and movtos.ciddocumentode = 4
    and doctos.ccancelado = 0

    Pero esto no funciona, sólo está incluyendo los productos que se han vendido

    qry_movtos

    Cómo puedo obtener lo requerido?.

    Gracias.

    Saludos,
    Javier
    • Editado jparada jueves, 6 de junio de 2019 19:35
    jueves, 6 de junio de 2019 19:35

Respuestas

  • Hola jparada:

    Sin lugar a dudas, la solución más fácil, es utilizar una tabla derivada.

    Envuelves tu consulta entre paréntesis, en un conjunto que en la solución que te muestro llamo queryInt. Este conjunto queryInt se relaciona mediante un left join con la consulta que has puesto primero, donde todos los productos, pueden tener o no productos de queryInt.

    select queryExt.ccodigoproducto, queryInt.cfolio, queryInt.fecha, queryInt.ctotal
    from admproductos as queryExt
    left join (
    	   select pdtos.ccodigoproducto,
    	   doctos.cfolio, 
    	   cast(movtos.cfecha as date) as 'fecha', 
    	    movtos.ctotal
    	   	from admproductos pdtos
    	   left outer join admMovimientos as movtos on pdtos.cidproducto = movtos.cidproducto
    	   inner join admDocumentos as doctos on movtos.ciddocumento = doctos.ciddocumento
    	   where pdtos.cidvalorclasificacion1 = 1
    	   and pdtos.ctipoproducto = 1 and pdtos.cstatusproducto = 1
    	   and movtos.cfecha between '20190606' and '20190606'
    	   and movtos.cidalmacen = 1
    	   and movtos.ciddocumentode = 4
    	   and doctos.ccancelado = 0
    
    ) as queryInt on queryExt.ccodigoproducto = queryInt.codigoproducto
    
     where
    queryExt.cidvalorclasificacion1 = 1
    and queryExt.ctipoproducto = 1 and queryExt.cstatusproducto = 1

    Es importante que todas las columnas de queryInt, tengan un alias.

    Si observas la salida, todas las columnas llamadas queryInt.algo te devolverán un null cuando no tengan ventas.

    Sino quieres null, puedes utilizar isnull(queryInt.algo, 'valor por defecto')

    Tablas derivadas

    https://javifer2.blogspot.com/search/label/Tabla%20derivadas

    Espero te ayude.

    • Marcado como respuesta jparada viernes, 7 de junio de 2019 0:53
    jueves, 6 de junio de 2019 19:53

Todas las respuestas

  • Hola jparada:

    Sin lugar a dudas, la solución más fácil, es utilizar una tabla derivada.

    Envuelves tu consulta entre paréntesis, en un conjunto que en la solución que te muestro llamo queryInt. Este conjunto queryInt se relaciona mediante un left join con la consulta que has puesto primero, donde todos los productos, pueden tener o no productos de queryInt.

    select queryExt.ccodigoproducto, queryInt.cfolio, queryInt.fecha, queryInt.ctotal
    from admproductos as queryExt
    left join (
    	   select pdtos.ccodigoproducto,
    	   doctos.cfolio, 
    	   cast(movtos.cfecha as date) as 'fecha', 
    	    movtos.ctotal
    	   	from admproductos pdtos
    	   left outer join admMovimientos as movtos on pdtos.cidproducto = movtos.cidproducto
    	   inner join admDocumentos as doctos on movtos.ciddocumento = doctos.ciddocumento
    	   where pdtos.cidvalorclasificacion1 = 1
    	   and pdtos.ctipoproducto = 1 and pdtos.cstatusproducto = 1
    	   and movtos.cfecha between '20190606' and '20190606'
    	   and movtos.cidalmacen = 1
    	   and movtos.ciddocumentode = 4
    	   and doctos.ccancelado = 0
    
    ) as queryInt on queryExt.ccodigoproducto = queryInt.codigoproducto
    
     where
    queryExt.cidvalorclasificacion1 = 1
    and queryExt.ctipoproducto = 1 and queryExt.cstatusproducto = 1

    Es importante que todas las columnas de queryInt, tengan un alias.

    Si observas la salida, todas las columnas llamadas queryInt.algo te devolverán un null cuando no tengan ventas.

    Sino quieres null, puedes utilizar isnull(queryInt.algo, 'valor por defecto')

    Tablas derivadas

    https://javifer2.blogspot.com/search/label/Tabla%20derivadas

    Espero te ayude.

    • Marcado como respuesta jparada viernes, 7 de junio de 2019 0:53
    jueves, 6 de junio de 2019 19:53
  • Hola Javi,

    Funcionó perfecto!!!.

    Gracias.

    Saludos,
    Javier
    • Editado jparada viernes, 7 de junio de 2019 0:53
    viernes, 7 de junio de 2019 0:52
  • Hola Javi:

    De nada.

    Saludos

    viernes, 7 de junio de 2019 4:00