Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Cambiar SubConsulta a relacion Left Outer Join

534 views
Skip to first unread message

Antonio Ortiz

unread,
Apr 2, 2008, 12:57:05 PM4/2/08
to
Agradeceria me ayudaran para cambiar esta consulta con una subconsulta de la
forma Left Outer Join, pues necesito obtener mas de 1 columna de la tabla
TbaKardex y de esta manera no me es posible, a menos que repita la consulta
para cada columna.

SELECT IDProducto, Codigo, Descripcion,
ISNULL(SELECT TOP 1 ExistenciaFinal
FROM TbaKardex
WHERE (Fecha BETWEEN '20080215 00:00' AND
'20080215 13:59') AND (TbaKardex.IDProducto = TbaProducto.IDProducto)
ORDER BY IDKardex DESC).0) AS ExistenciaFinal
FROM TbaProducto


gracias de antemano,


Antonio Ortiz
asesor en sistemas
www.aortiz.net
www.progvisual.com


Maxi Accotto

unread,
Apr 2, 2008, 8:07:34 PM4/2/08
to
Hola, sin saber como son las tablas, los datos y que esperas como resultado
se me hace por lo menos a mi muy dificil ayudarte!

Pasame la estructura de las tablas, ejemplos de datos y que buscas obtener

--

-----------------------------
Microsoft MVP SQLServer
www.sqltotalconsulting.com
-------------------------------

"Antonio Ortiz" <a...@aortiz.net> escribió en el mensaje de
noticias:#ZScdKOl...@TK2MSFTNGP04.phx.gbl...

Antonio Ortiz

unread,
Apr 2, 2008, 8:48:16 PM4/2/08
to
ok, va mas informacion

Tabla: TbaKardex
IDKardex
Fecha {Contiene Fecha y hora
IDProducto
ExistenciaInicial
Cantidad
ExistenciaFinal

Tabla: TbaProducto
IDProducto
Codigo
Descripcion


-> La tabla TbaKardex contiene un registro por cada movimiento que afecta el
inventario, como puede ser: Compra, Venta, Entrada, Salida, Traspaso, lo
unico que necesito es que me diga el inventario que habia de cada producto a
una fecha (al final del dia). Si el producto no tuvo movimientos en la fecha
seleccionada, se toma existencia final del movimiento anterior. Si no existe
movimiento anterior a la fecha seleccionada la existencia sera 0.


gracias por tu tiempo,


Antonio Ortiz
asesor en sistemas
www.aortiz.net
www.progvisual.com

"Maxi Accotto" <max...@infovia.com.ar.sacame> escribió en el mensaje
news:%23HJtq6R...@TK2MSFTNGP04.phx.gbl...

Maxi Accotto

unread,
Apr 3, 2008, 7:34:50 PM4/3/08
to
Antonio, quiero ayudarte pero creo que nos debemos ayudar de forma mutua no?
te pido por favor que me pases lo que te he solicitado,

La estructura, algunos datos de ejemplo, y que buscas como resultado con
datos, o sea como deberia quedar el resultado segun los datos de ejemplo.
Porque el diseño de tu aplicacion lo conoces bien tu, yo puedo tirar quizas
una query aqui que ni te ayude.

Pasame eso si y vemos como resolver el problema

--

-----------------------------
Microsoft MVP SQLServer
www.sqltotalconsulting.com
-------------------------------

"Antonio Ortiz" <a...@aortiz.net> escribió en el mensaje de

noticias:ejjoxRSl...@TK2MSFTNGP02.phx.gbl...

Antonio Ortiz

unread,
Apr 3, 2008, 8:31:56 PM4/3/08
to
Despues de intentar varias veces de distintas maneras logre hacerlo de esta
manera:

SELECT IDProducto, Codigo, Descripcion, ISNULL
((SELECT TOP 1 ExistenciaFinal


FROM TbaKardex
WHERE (Fecha BETWEEN '20080215 00:00' AND
'20080215 13:59') AND (TbaKardex.IDProducto = TbaProducto.IDProducto)

ORDER BY IDKardex DESC), 0) AS ExistenciaFinal
FROM TbaProducto


* De cualquier manera te pongo los datos de ejemplo por si hay una mejor
forma de hacer la consulta:

TbaProducto
{ IDProducto, Codigo, Descripcion }
---------------------------------------
1, 100, Coca Cola
2, 120, Pepsi
3, 90, Fanta
4, 200, Sprite


TbaKardex
{ IDKardex, Fecha, IDProducto, ExistenciaInicial, Cantidad,
ExistenciaFinal }
--------------------------------------------------------------------------------
1000, 14/02/2008 11:30, 2, 10, 1, 9
1000, 14/02/2008 11:30, 2, 9, 1, 8
1000, 14/02/2008 11:30, 3, 5, 1, 4
1001, 14/02/2008 15:48, 1, 18, 1, 17
1000, 15/02/2008 09:02, 1, 17, 1, 16
1000, 15/02/2008 09:14, 3, 4, 1, 3
1000, 15/02/2008 09:02, 1, 16, 1, 15
1000, 15/02/2008 10:49, 1, 15, 1, 14


Con la consulta deberia obtener:

1, Coca Cola, 14
2, Pepsi, 8
3, Fanta, 3
4, Sprite, 0


Gracias por tu tiempo,

Antonio Ortiz
asesor en sistemas
www.aortiz.net
www.progvisual.com

"Maxi Accotto" <max...@infovia.com.ar.sacame> escribió en el mensaje

news:esb9BNel...@TK2MSFTNGP03.phx.gbl...

Antonio Ortiz

unread,
Apr 3, 2008, 8:38:17 PM4/3/08
to
Correcion, la consulta que me funciono es esta:

SELECT TbaProducto.IDProducto, TbaProducto.Codigo, TbaProducto.Descripcion,
IsNull(K.ExistenciaInicial,0) as ExistenciaInicial, IsNull(K.Cantidad,0) as
Cantidad, IsNull(K.ExistenciaFinal,0) as ExistenciaFinal
FROM TbaProducto
LEFT OUTER JOIN
( SELECT TbaKardex.* FROM TbaKardex INNER JOIN ( SELECT TbaKardex.IDProducto
AS IDProducto, MAX(IDKardex) AS IDKardex
FROM TbaKardex WHERE (Fecha <= '20080215 23:59:59.99') And (IDAlmacen=1)
GROUP BY TbaKardex.IDProducto ) K2 ON TbaKardex.IDKardex=K2.IDKardex ) K
ON TbaProducto.IDProducto = K.IDProducto


Antonio Ortiz
asesor en sistemas
www.aortiz.net
www.progvisual.com

"Antonio Ortiz" <a...@aortiz.net> escribió en el mensaje
news:uS2LTtel...@TK2MSFTNGP04.phx.gbl...

Carlos M. Calvelo

unread,
Apr 4, 2008, 5:38:35 AM4/4/08
to
Hola Antonio,

On 4 apr, 02:31, "Antonio Ortiz" <a...@aortiz.net> wrote:
> Despues de intentar varias veces de distintas maneras logre hacerlo de esta
> manera:
>
> SELECT IDProducto, Codigo, Descripcion, ISNULL
> ((SELECT TOP 1 ExistenciaFinal
> FROM TbaKardex
> WHERE (Fecha BETWEEN '20080215 00:00' AND
> '20080215 13:59') AND (TbaKardex.IDProducto = TbaProducto.IDProducto)
> ORDER BY IDKardex DESC), 0) AS ExistenciaFinal
> FROM TbaProducto
>
> * De cualquier manera te pongo los datos de ejemplo por si hay una mejor
> forma de hacer la consulta:
>
> TbaProducto
> { IDProducto, Codigo, Descripcion }
> ---------------------------------------
> 1, 100, Coca Cola
> 2, 120, Pepsi
> 3, 90, Fanta
> 4, 200, Sprite
>
> TbaKardex
> { IDKardex, Fecha, IDProducto, ExistenciaInicial, Cantidad,
> ExistenciaFinal }

> ---------------------------------------------------------------------------­-----


> 1000, 14/02/2008 11:30, 2, 10, 1, 9
> 1000, 14/02/2008 11:30, 2, 9, 1, 8
> 1000, 14/02/2008 11:30, 3, 5, 1, 4
> 1001, 14/02/2008 15:48, 1, 18, 1, 17
> 1000, 15/02/2008 09:02, 1, 17, 1, 16
> 1000, 15/02/2008 09:14, 3, 4, 1, 3
> 1000, 15/02/2008 09:02, 1, 16, 1, 15
> 1000, 15/02/2008 10:49, 1, 15, 1, 14
>
> Con la consulta deberia obtener:
>
> 1, Coca Cola, 14
> 2, Pepsi, 8
> 3, Fanta, 3
> 4, Sprite, 0
>

Yo entiendo que lo que necesitas es la ExistenciaFinal
por producto, por día, que con los datos que das deberías
obtener esto:

1, Coca Cola, 14/02/2008, 17
1, Coca Cola, 15/02/2008, 14
2, Pepsi, 14/02/2008, 8
3, Fanta, 14/02/2008, 4
3, Fanta, 15/02/2008, 3
4, Sprite, , 0

A ver si te vale la siguiente consulta.
Por producto, por dia, selecciona el registro con ExistenciaFinal
para el que no existe otro registro con ExistenciaInicial igual
a esa ExistenciaFinal. (Espero se entienda.)

select
P.IDProducto,
P.Descripcion,
convert(char(10),K.Fecha,103) as Fecha,
K.ExistenciaFinal
from
TbaProducto P
Left join
(
select
K1.IDProducto,
K1.Fecha,
K1.ExistenciaFinal
from
TbaKardex K1
where
not exists
(
select *
from TbaKardex
where
IDProducto = K1.IDProducto and
convert(char(8),Fecha,112) = convert(char(8),K1.Fecha,112)
and
ExistenciaInicial = K1.ExistenciaFinal
)
) K on P.IDProducto= K.IDProducto
order by
P.IDProducto,
K.Fecha

Saludos,
Carlos

Antonio Ortiz

unread,
Apr 4, 2008, 12:48:50 PM4/4/08
to
Gracias, solo necesito la existencia al final del dia que indico, esto es,
el mi aplicacion existe un cuadro de texto donde el usuario indica la fecha
a la cual desea obtener las existencias de todos los productos. Si observas
en un dia determinado no todos los productos tienen movimientos, entonces la
existencia sera la del movimiento anterior inmediato.

saludos,

Antonio Ortiz
asesor en sistemas
www.aortiz.net
www.progvisual.com

"Carlos M. Calvelo" <c_ja...@hotmail.com> escribió en el mensaje
news:ade2622b-9707-4615...@d45g2000hsc.googlegroups.com...

Carlos M. Calvelo

unread,
Apr 4, 2008, 2:12:27 PM4/4/08
to
Hola Antonio,

On 4 apr, 18:48, "Antonio Ortiz" <a...@aortiz.net> wrote:
> Gracias, solo necesito la existencia al final del dia que indico, esto es,
> el mi aplicacion existe un cuadro de texto donde el usuario indica la fecha
> a la cual desea obtener las existencias de todos los productos. Si observas
> en un dia determinado no todos los productos tienen movimientos, entonces la
> existencia sera la del movimiento anterior inmediato.
>

He puesto la solución anterior porque en los datos que has puesto
de ejemplo me salto lo siguiente a la vista:

{ IDKardex, Fecha, IDProducto, ExistenciaInicial, Cantidad,
ExistenciaFinal }

1000, 14/02/2008 11:30, 2, 10, 1, 9
1000, 14/02/2008 11:30, 2, 9, 1, 8

Dos registros del mismo producto con la misma fecha y hora
y he pensado que la ExistenciaFinal (= 9) del primero es la
ExistenciaInicial del segungo (= 9) y por lo tanto tenemos
que seleccionar el segundo.
O sea que con la fecha y hora no es suficiente para seleccionar
el último.

Al mismo tiempo veo que IDKardex es para los dos registros
el mismo y eso me hace pensar que estos datos no son reales.

Entonces dudo cual es el orden de los registros; la fecha,
ExistenciaInicial y Final o una combinación de los dos.
Es necesario aclarar antes esto para determinar cual es
el último movimiento antes de una fecha determinada.

Saludos,
Carlos

Antonio Ortiz

unread,
Apr 6, 2008, 3:18:09 PM4/6/08
to
Disculpas, fue un error mio, IDKardex es incremental y deberia se secuencial

saludos,


Antonio Ortiz
asesor en sistemas
www.aortiz.net
www.progvisual.com

"Carlos M. Calvelo" <c_ja...@hotmail.com> escribió en el mensaje

news:8ab6e80b-5d72-47e6...@s8g2000prg.googlegroups.com...

Carlos M. Calvelo

unread,
Apr 6, 2008, 6:08:11 PM4/6/08
to
Hola Antonio,

On 6 apr, 21:18, "Antonio Ortiz" <a...@aortiz.net> wrote:
> Disculpas, fue un error mio, IDKardex es incremental y deberia se secuencial
>

Pues a mi me parece que la solución que tu has encontrado
ha está bastante bien no?

En el FROM puedes evitarte un SELECT * FROM porque
SELECT TbaKardex.* FROM TbaKardex
es lo mismo que simplemente TbaKardex

FROM
TbaProducto
LEFT OUTER JOIN

( TbaKardex K
INNER JOIN
( SELECT IDProducto,


MAX(IDKardex) AS IDKardex
FROM TbaKardex
WHERE (Fecha <= '20080215 23:59:59.99') And (IDAlmacen=1)

GROUP BY IDProducto
) K2 ON K.IDKardex=K2.IDKardex
) ON TbaProducto.IDProducto = K.IDProducto


Supongo que la fecha viene en una cadena 'AAAAMMDD'
Entonces yo pondría un
(Fecha < CAST(@fecha as datetime) + 1)
en vez de
(Fecha <= @fecha + ' 23:59:59.99')

En fin... solo detalles de los que se puede decir que
para gustos se pintan colores.

Saludos,
Carlos

Antonio Ortiz

unread,
Apr 7, 2008, 12:13:17 AM4/7/08
to
Gracias, procedo a probar.


Antonio Ortiz
asesor en sistemas
www.aortiz.net
www.progvisual.com

"Carlos M. Calvelo" <c_ja...@hotmail.com> escribió en el mensaje

news:3deaaf5a-87e6-4f25...@v32g2000prd.googlegroups.com...

0 new messages