Cambiar SubConsulta a relacion Left Outer Join

02/04/2008 - 18:57 por Antonio Ortiz | Informe spam
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

Preguntas similare

Leer las respuestas

#6 Carlos M. Calvelo
04/04/2008 - 11:38 | Informe spam
Hola Antonio,

On 4 apr, 02:31, "Antonio Ortiz" wrote:
Mostrar la cita
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
#7 Antonio Ortiz
04/04/2008 - 18:48 | Informe spam
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" escribió en el mensaje
news:
Hola Antonio,

On 4 apr, 02:31, "Antonio Ortiz" wrote:
Mostrar la cita
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
#8 Carlos M. Calvelo
04/04/2008 - 20:12 | Informe spam
Hola Antonio,

On 4 apr, 18:48, "Antonio Ortiz" wrote:
Mostrar la cita
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
#9 Antonio Ortiz
06/04/2008 - 21:18 | Informe spam
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" escribió en el mensaje
news:
Hola Antonio,

On 4 apr, 18:48, "Antonio Ortiz" wrote:
Mostrar la cita
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
#10 Carlos M. Calvelo
07/04/2008 - 00:08 | Informe spam
Hola Antonio,

On 6 apr, 21:18, "Antonio Ortiz" wrote:
Mostrar la cita
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
Ads by Google
Search Busqueda sugerida