PDA

Ver la Versión Completa : Consulta SQL que me quita el sueño.


radaalvaro
21-04-2007, 01:03:42
Amigos, les pido una mano con esta consulta, al parecer simple ya que solo interviene 1 tabla, pero me dejo pensando mucho.

El problema es el siguiente.

Tengo la tabla
--ListaPrecios
los campos son:
-Precio >> Que es el precio que se le va a asignar a un producto
-FIVigencia >> Es la fecha de Inicio de esa vigencia.
-Cod_Producto >> Es el código del Producto.
-Cod_TipoPrecio >> Es el codigo del Tipo de Lista de Precios.
-Cod_Moneda >> Es la moneda en la que esta el precio asignado.

Ahora lo que pretendo sacar de ahi es.

Una Lista de los Precios en Vigencia de los Productos y Tipos Productos.

Al ser en vigencia eso significa que la fecha de registro tiene que ser la última segun producto y Tipo de Precio

Por ejem.

Prod1 TipoA 01/04/07 50 DOL
Prod1 TipoB 03/04/07 40 DOL
Prod2 TipoA 04/04/07 80 DOL
Prod3 TipoB 08/04/07 300 BOL >> PD: BOL es derivado de Bolivianos.

Estuve pensando en hacer un

Select Cod_Producto, Cod_TipoPrecio, Max(FIVigencia) from ListaPrecios group by Cod_Producto, Cod_TipoPrecio.

El problema esta en que no se como meter ahi, el precio de esa fecha máxima y la moneda.

Por favor si alguien sabe como hacerlo, les agradeceria mucho su respuesta.

Saludos.

momo
21-04-2007, 21:25:12
Espero poder ayudarte o por lo menos darte una idea, prodrías hacer algo así:

SELECT l.Cod_Producto, l.Precio, l.FIVigencia, l.Cod_TipoPrecio, l.Cod_Moneda
FROM ListaPrecios l,
(Select Cod_Producto, Cod_TipoPrecio, Max(FIVigencia)
from ListaPrecios group by Cod_Producto, Cod_TipoPrecio)a
WHERE l.Cod_Producto = a.Cod_Producto
AND l.Cod_TipoPrecio = a.Cod_TipoPrecio
AND l.FIVigencia = a.FIVigencia


Solo es un ejemplo la idea principal esta plasmada, tienes que asegurarte que en realidad de funciona.

Si alguien tiene una mejor sugerencia adelante.

Saludos.

hach
21-04-2007, 22:14:27
No tengo como probarlo, pero se podra hacer algo asi?


Select lp.*
from ListaPrecios lp
where lp.FIVigencia= (select max(lp2.FIVigencia) from ListaPrecios lp2
where lp2.Cod_Producto=lp.Cod_Producto
and lp2.Cod_TipoPrecio=lp.Cod_TipoPrecio
and lp2.Cod_Moneda=lp.Cod_Moneda)


o mas sencillo, en vez de tener FIVigencia reemplazalo por
FFVigencia (fecha fin vigencia)
el precio actual lo pones con FFVigencia en NULL, al cambiar precio,
insertas un registro con FFVigencia en NULL y le pones
FFVigencia con la fecha actual al registro que cambio

Entonces en el select solo haces


Select lp.*
from ListaPrecios lp
where lp.FFVigencia is NULL



al cabiar precio, dentro de una transaccion haces

update ListaPrecios set FFVigencia = CURRENTDATE
where Cod_Producto=......... and .....

insert into ListaPrecios ... con FFVigencia =NULL


Espero que te sirva la idea

radaalvaro
21-04-2007, 22:29:54
Muchas gracias por sus sugerencias, ambas funcionan son acertadas, pero hay algunos detalles que quisiera subsanar.

Por Ejem, en la siguiente consulta sugerida por hach.


Select lp.*
from ListaPrecios lp
where lp.FIVigencia= (select max(lp2.FIVigencia) from ListaPrecios lp2
where lp2.Cod_Producto=lp.Cod_Producto
and lp2.Cod_TipoPrecio=lp.Cod_TipoPrecio
and lp2.Cod_Moneda=lp.Cod_Moneda)



Estaríamos ejecutando la segunda consulta por cada uno de los registros de la primera consulta.
En caso de tener muchos registros, eso sería un poco costoso en tiempo.

Alguien sabe si sería posible mejorar (optimizar) aún mas esa consulta?

Saludos. Y nuevamente muchas gracias HACH me sirvio mucho tu colaboración.

hach
22-04-2007, 00:45:44
No estoy seguro que sea una consulta por cada registro...
Yo creo que es una consulta extra por cada
Cod_Producto, Cod_TipoPrecio, Cod_Moneda distintos...
pero no estoy seguro

con los indices correctos no tendrias que tener problemas

Saludos