Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Consulta SQL que me quita el sueño. (https://www.clubdelphi.com/foros/showthread.php?t=42735)

radaalvaro 21-04-2007 01:03:42

Consulta SQL que me quita el sueño.
 
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

Código SQL [-]
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

se podra hacer algo asi?
 
No tengo como probarlo, pero se podra hacer algo asi?

Código SQL [-]
 
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

Código SQL [-]
 
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

Buenas sugerencia.
 
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.
Cita:

Empezado por hach

Código SQL [-]
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 tan seguro...
 
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


La franja horaria es GMT +2. Ahora son las 16:14:51.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi