A ver, me parece que no nos entendemos :) 

Vamos con un ejemplo, que siempre es lo mejor: 

tabla1: 
producto 1, fecha 20021010

tabla2 :

producto 1, fecha hasta 20020505, precio 5
producto 1, fecha hasta 20020905, precio 10
producto 1, fecha hasta 20021231, precio 15

el precio a aplicar ser�a 10, por ser el del registro con mayor fecha hasta
menor o igual a la fecha de la tabla1.

Haciendo group by por producto, fecha y precio, te sacar� un registro por
cada uno de los distintos valores de producto-fecha -precio que aparezcan en
los registros, con un m�ximo de hastafecha por cada uno de los distintos
valores de estos tres campos. Con lo que el resultado del sql que comentas
para estos datos ser�an los registros:

1, 20021010, 20020905, 10  <-- este es el registro que realmente se quiere
1, 20021010, 20020505, 5

Para el segundo registro, 20020505 es la fechahasta m�xima (y �nica en el
ejemplo) para producto 1, fecha 20021010 y precio 5 (este es el problema de
incluir el precio de la segunda tabla en el group by).

En el sql de Jos� Luis se hace un segundo select para obtener la fecha
m�xima a nivel de producto, y con ella recupera el registro correcto de
tabla2. Esto es algo que no se puede hacer (que yo sepa) en un solo paso en
una sentencia con group by.


Saludos.

Fernando P�rez.
Cer�mica Saloni. Dpto. Sistemas
<mailto:[EMAIL PROTECTED]>


-----Mensaje original-----
De: Miguel Angel Peinador [mailto:[EMAIL PROTECTED]]
Enviado el: lunes, 16 de diciembre de 2002 13:06
Para: [EMAIL PROTECTED]
Asunto: Re: Sentencia SQL


Existiendo coherencia en los datos, esto es: en tabla2, la clave �nica
(PRODUCTO, HASTAFECHA) con una relaci�n UNITARIA con PRECIO, mi sentencia es
"correcta".

Select producto, fecha, max(hastafecha), precio
from tabla1 a, tabla2 b
where a.producto = b.producto
and fecha >= hastafecha
group by producto, fecha, precio


Interpretas bien al decir que son las tarifas de precios por fechas, y claro
que tiene sentido a diferente fecha diferente precio, pero no es eso lo que
he dicho, lo que he dicho es:

Si saliera m�s de un registro por producto, quiere decir: que a misma fecha
y producto tiene varios precios -para una misma clave �nica: PRODUCTO,FECHA-

Si se diera este caso, no se podr�a conseguir el precio, ni con una ni con
varias sentencias SQL. Habr�a que replantear las tablas.


Lo ilustr� con el ejemplo:

tabla1

  producto  fecha

  CLAVOS  20020918
  TUERCAS   20020106

tabla2

  producto   hastafecha precio
->CLAVOS  20020918 1000
->CLAVOS  20020918 2000
  CLAVOS  20020718 1000
  CLAVOS  20020818 1000

si esto es as�: �cu�l es el precio de los clavos para el 19-12-2002?

�1000? �2000?

-no se puede definir-

Hay incongruencia en los datos o la clave de la tabla2 es insuficiente para
definir de forma univoca el precio, luego no hay forma de aplicar -como
dices- "A un producto y fecha se debe aplicar �nicamente un registro de
tabla2, que ser�a el precio
m�s actualizado del producto a esa fecha."

Y dices:

"El problema es que al hacerlo por SQL necesitamos un
Group by por producto, aplicando el max sobre hastafecha, para saber cual es
el mayor de los iguales o inferiores a fecha, pero al hacer esto no podemos
recuperar en la misma sentencia el precio."

Reconozco tu ortodoxia en el manejo de tablas. Y con riesgo a equivocarme,
pienso:

Si lo que busco es una �nica relaci�n 'producto <-> precio en un momento
dado'.

�tan mal est� incluido el precio en el group by?

Un saludo,
Miguel







----- Original Message -----
From: "Fernando P�rez" <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Monday, December 16, 2002 12:06 PM
Subject: RE: Sentencia SQL


Viendo la estructura de datos yo interpreto que la tabla2 son las tarifas de
precio por fechas. Desde ese punto de vista tiene sentido que para un mismo
producto hayan varios precios para hastafecha distintas. A un producto y
fecha se debe aplicar �nicamente un registro de tabla2, que ser�a el precio
m�s actualizado del producto a esa fecha (con el mayor hastafecha que sea <=
que tabla1.fecha). El problema es que al hacerlo por SQL necesitamos un
Group by por producto, aplicando el max sobre hastafecha, para saber cual es
el mayor de los iguales o inferiores a fecha, pero al hacer esto no podemos
recuperar en la misma sentencia el precio.

Saludos.

Fernando P�rez.
Cer�mica Saloni. Dpto. Sistemas
<mailto:[EMAIL PROTECTED]>


-----Mensaje original-----
De: Miguel Angel Peinador [mailto:[EMAIL PROTECTED]]
Enviado el: lunes, 16 de diciembre de 2002 11:45
Para: [EMAIL PROTECTED]
Asunto: Re: Sentencia SQL


Si saliera m�s de un registro por producto, quiere decir: que a misma fecha
y producto tiene varios precios -para una misma clave �nica: PRODUCTO,
FECHA-. Lo cual indica una seria incongruencia en los datos, creo que si mi
sentencia no es v�lida, habr�a que replantear la tabla2.

Algo as�:

>
> tabla1:  producto
>          fecha              (Un solo registro por producto)
>
> tabla2:  producto
>          hastafecha
>          precio              (varios registros por producto)
>

tabla1

  producto  fecha

  CLAVOS  20020918
  TUERCAS   20020106

tabla2

  producto   hastafecha precio
->CLAVOS  20020918 1000
->CLAVOS  20020918 2000
  CLAVOS  20020718 1000
  CLAVOS  20020818 1000


en cualquier caso, -y a�n con mal planteamiento inicial de la tabla2-, si
existen precios distintos para mismo producto y misma fecha, creo que tiene
sentido incluirlo en el group by.

Un saludo,
Miguel

----- Original Message -----
From: "Fernando P�rez" <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Monday, December 16, 2002 11:19 AM
Subject: RE: Sentencia SQL


No podr�as. F�jate que si pones el precio en el group by te saldr�a m�s de
un registro por producto, y el max(fecha) ser�a a nivel de producto y
precio, en lugar de solamente a nivel de producto.

Creo que no hay forma de sacar los datos con un group by y solo una
sentencia (la sentencia de Jos� Luis son en realidad dos, ya que tiene dos
select). Se quiere el precio del producto correspondiente al registro de la
segunda tabla con la mayor fecha . �sta se obtiene con un Max, pero el
precio no es recuperable con ninguna funci�n que se pueda aplicar en el
Group by

Saludos.

Fernando P�rez.
Cer�mica Saloni. Dpto. Sistemas
<mailto:[EMAIL PROTECTED]>


-----Mensaje original-----
De: Miguel Angel Peinador [mailto:[EMAIL PROTECTED]]
Enviado el: lunes, 16 de diciembre de 2002 10:44
Para: [EMAIL PROTECTED]
Asunto: Re: Sentencia SQL


bueno, tambi�n se puede incluir en el select (y en el group by)


Select producto, fecha, max(hastafecha), precio
from tabla1 a, tabla2 b
where a.producto = b.producto
and fecha >= hastafecha
group by producto, fecha, precio

lo de la eficiencia ya depende de muchos factores..., a mi no me va muy mal
probandolo con fichero gordos, pero si tuviera que hacer algo similar -y
pudiera elegir- no usar�a SQL sino RPG � COBOL, que ser�a mucho m�s
eficiente.

----- Original Message -----
From: "Fernando P�rez" <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Monday, December 16, 2002 10:26 AM
Subject: RE: Sentencia SQL


Esta sentencia ser�a la mas eficiente si no tuviera que recuperar tambi�n el
precio de la segunda tabla. Al tener que recuperarlo obligar�a a un segundo
sql sobre la segunda tabla, buscando por producto y la fecha recuperada en
el primero.

Saludos.

Fernando P�rez.
Cer�mica Saloni. Dpto. Sistemas
<mailto:[EMAIL PROTECTED]>


-----Mensaje original-----
De: Miguel Angel Peinador [mailto:[EMAIL PROTECTED]]
Enviado el: lunes, 16 de diciembre de 2002 10:09
Para: [EMAIL PROTECTED]
Asunto: Re: Sentencia SQL


prueba con esto:

Select producto, fecha, max(hastafecha)
from tabla1 a, tabla2 b
where a.producto = b.producto
and fecha >= hastafecha
group by producto, fecha


Un saludo,
Miguel

----- Original Message -----
From: "Jose Luis Mur Lalueza" <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Sunday, December 15, 2002 6:34 PM
Subject: Sentencia SQL


> Hola,
>
> C�mo resolver�ais esto con SQL?
>
> tabla1:  producto
>          fecha              (Un solo registro por producto)
>
> tabla2:  producto
>          hastafecha
>          precio              (varios registros por producto)
>
>
> Necesito unir las 2 tablas, un solo registro de la tabla2 cuyo campo fecha
> sea el m�s proximo inferior o igual al campo fecha de la tabla1.
>
> Los obtengo con la siguiente sentencia: Select * from tabla1 a, tabla2 b
> where a.producto = b.producto and b.hastafecha = (select max(hastafecha)
> from tabla2 c where b.producto = c.producto and c.hastafecha <= a.fecha)
>
> El problema es que me genera una via de acceso de la tabla2 y tiene muchos
> registros
>
> Se os ocurre algo?
>
> slds
> Jos� Luis
>
>
>
> _____________________________________________________
> Forum.HELP400 es un servicio m�s de NEWS/400.
> � Publicaciones Help400, S.L. - Todos los derechos reservados
> http://www.help400.es
> _____________________________________________________
>
> Para darte de baja, env�a el mensaje resultante de pulsar
> mailto:[EMAIL PROTECTED]?body=LEAVE


_____________________________________________________
Forum.HELP400 es un servicio m�s de NEWS/400.
� Publicaciones Help400, S.L. - Todos los derechos reservados
http://www.help400.es
_____________________________________________________

Para darte de baja, env�a el mensaje resultante de pulsar
mailto:[EMAIL PROTECTED]?body=LEAVE

_____________________________________________________
Forum.HELP400 es un servicio m�s de NEWS/400.
� Publicaciones Help400, S.L. - Todos los derechos reservados
http://www.help400.es
_____________________________________________________

Para darte de baja, env�a el mensaje resultante de pulsar
mailto:[EMAIL PROTECTED]?body=AVE


_____________________________________________________
Forum.HELP400 es un servicio m�s de NEWS/400.
� Publicaciones Help400, S.L. - Todos los derechos reservados
http://www.help400.es
_____________________________________________________

Para darte de baja, env�a el mensaje resultante de pulsar
mailto:[EMAIL PROTECTED]?body=LEAVE

_____________________________________________________
Forum.HELP400 es un servicio m�s de NEWS/400.
� Publicaciones Help400, S.L. - Todos los derechos reservados
http://www.help400.es
_____________________________________________________

Para darte de baja, env�a el mensaje resultante de pulsar
mailto:[EMAIL PROTECTED]?body=AVE


_____________________________________________________
Forum.HELP400 es un servicio m�s de NEWS/400.
� Publicaciones Help400, S.L. - Todos los derechos reservados
http://www.help400.es
_____________________________________________________

Para darte de baja, env�a el mensaje resultante de pulsar
mailto:[EMAIL PROTECTED]?body=LEAVE

_____________________________________________________
Forum.HELP400 es un servicio m�s de NEWS/400.
� Publicaciones Help400, S.L. - Todos los derechos reservados
http://www.help400.es
_____________________________________________________

Para darte de baja, env�a el mensaje resultante de pulsar
mailto:[EMAIL PROTECTED]?body=AVE


_____________________________________________________
Forum.HELP400 es un servicio m�s de NEWS/400.
� Publicaciones Help400, S.L. - Todos los derechos reservados
http://www.help400.es
_____________________________________________________

Para darte de baja, env�a el mensaje resultante de pulsar
mailto:[EMAIL PROTECTED]?body=LEAVE

_____________________________________________________
Forum.HELP400 es un servicio m�s de NEWS/400.
� Publicaciones Help400, S.L. - Todos los derechos reservados
http://www.help400.es
_____________________________________________________

Para darte de baja, env�a el mensaje resultante de pulsar
mailto:[EMAIL PROTECTED]?body=LEAVE

Responder a