Principales respuestas
Obtener total de productos estén o no en la tabla de ventas

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.
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
Cómo puedo obtener lo requerido?.
Gracias.
Saludos,
Javier- Editado jparada 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
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
-
-