Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Sobre el uso de MAX (https://www.clubdelphi.com/foros/showthread.php?t=53793)

Gabo 29-02-2008 23:12:02

Sobre el uso de MAX
 
Hola a todos!!!

A ver si pueden echarme una mano con una consulta que no sale, ¿será la hora? (Son las 23:03)

Simplificaré un poco las tablas para que se entienda:

EMPRESA
-------
EMPRESA_CODIGO PK
EMPRESA_NOMBRE

TIPO
----
TIPO_CODIGO PK
TIPO_NOMBRE

PRODUCTO
--------
PRODUCTO_CODIGO PK
EMPRESA_CODIGO FK
TIPO_CODIGO FK
PRODUCTO_FECHA
PRODUCTO_PRECIO

Lo que quiero obtener es un listado por empresas donde me aparezca:

EMPRESA - TIPO - PRODUCTO - FECHA - PRECIO

Pero que solo me muestre la fecha mayor.

Tengo la consulta así:

Código SQL [-]
 
SELECT PRODUCTO_CODIGO, TIPO_NOMBRE, EMPRESA_NOMBRE, PRODUCTO_NOMBRE, PRODUCTO_FECHA, PRODUCTO_PRECIO, PRODUCTO_DEFECTO 
FROM PRODUCTO JOIN TIPO ON PRODUCTO.TIPO_CODIGO=TIPO.TIPO_CODIGO 
                         JOIN EMPRESA ON PRODUCTO.EMPRESA_CODIGO=EMPRESA.EMPRESA_CODIGO 
           WHERE EMPRESA.EMPRESA_CODIGO=:empresa \
           ORDER BY TIPO_NOMBRE, EMPRESA_NOMBRE, PRODUCTO_NOMBRE, PRODUCTO_FECHA, PRODUCTO_PRECIO

y ahora mismo no veo como hacer para que de cada unión EMPRESA-TIPO me seleccione la fecha mayor. :(

Gracias de antemano por la ayuda...

gluglu 29-02-2008 23:26:49

No me aclaro bien con tu consulta ....

Deseas obtener un listado de la tabla Productos, o un listado de la tabla Empresas ?

Lo digo porque en tu condición 'From' especificas que obtenga los registros de la tabla Productos. Si pudieras indicar un set de datos de terminados como ejemplo, y el resultado que deseas obtener, intentaría ayudarte.

;)

Gabo 29-02-2008 23:54:44

Cita:

Empezado por gluglu (Mensaje 269825)
No me aclaro bien con tu consulta ....

Deseas obtener un listado de la tabla Productos, o un listado de la tabla Empresas ?

Lo digo porque en tu condición 'From' especificas que obtenga los registros de la tabla Productos. Si pudieras indicar un set de datos de terminados como ejemplo, y el resultado que deseas obtener, intentaría ayudarte.

;)

Antes que nada, gracias por responder... :)
Con éste me quedo en +1 (no en post, si no en deuda contigo :D)

Quiero obtener un listado de la tabla Productos.

Supongamos que:

Código:

EMPRESA
-------
01 JB MARTINEZ
02 COLABE, SA
 
TIPO
----
11 SEGUNDA
12 PRIMERA
 
PRODUCTO
--------
21  01  11  02/12/07  23,34
22  01  12  01/12/07  20,67
23  02  11  04/12/07  56,67
24  01  11  03/12/07  26,78
25  02  11  07/12/07  34,56
26  01  12  08/12/07  56,78

El listado debería quedar así:

Código:

TIPO    EMPRESA    PRODUCTO    FECHA    PRECIO
--------------------------------------------------- 
PRIMERA  JB MARTINEZ 26          08/12/07  56,78
SEGUNDA  COLABE,SA  25          07/12/07  34,56
SEGUNDA  JB MARTINEZ 24          03/12/07  26,78

Es decir, cuando el tipo y la empresa son el mismo, conservo el registro con la fecha mayor.

gluglu 01-03-2008 00:10:41

A ver si esto funcionara ....

Código SQL [-]
Select TIPO.TIPO_NOMBRE, EMPRESA.EMPRESA_NOMBRE, PRODUCTO.PRODUCTO_CODIGO,
Max(PRODUCTO.PRODUCTO_FECHA), Max(PRODUCTO.PRODUCTO_PRECIO)
from PRODUCTO
Join TIPO
  On PRODUCTO.TIPO_CODIGO = TIPO.TIPO_CODIGO 
Join EMPRESA
  On PRODUCTO.EMPRESA_CODIGO = EMPRESA.EMPRESA_CODIGO 
Where EMPRESA.EMPRESA_CODIGO = :empresa  // Supongo que esta condición sobra (pero la he dejado por si acaso)
Group By PRODUCTO.EMPRESA_CODIGO, PRODUCTO.TIPO_CODIGO

Insisto .... no lo he probado.

Pero me remito adicionalmente a este hilo

Saludos :rolleyes:

gluglu 01-03-2008 00:17:45

Ya me he dado cuenta de un fallo del código que acabo de poner.

Supongo que deseas obtener el precio correspondiente a la mayor fecha, no el mayor precio .... no es verdad ?

Con la sentencia que te he puesto, no se obtiene así. Se obtiene por un lado la mayor fecha, y por otro lado el mayor de los precios para cada uno de los registros del Group By ...

A ver .... estoy en ello. :rolleyes:

Gabo 01-03-2008 00:30:55

Cita:

Empezado por gluglu (Mensaje 269835)
Ya me he dado cuenta de un fallo del código que acabo de poner.

Supongo que deseas obtener el precio correspondiente a la mayor fecha, no el mayor precio .... no es verdad ?

Con la sentencia que te he puesto, no se obtiene así. Se obtiene por un lado la mayor fecha, y por otro lado el mayor de los precios para cada uno de los registros del Group By ...

A ver .... estoy en ello. :rolleyes:

Bueno, justo iba a postear...

Además, con los group by de esa forma da el error de "referencia de columna inválida" y al ajustarlo a los campos del select no filtra por el mayor, sino que los muestra todos.

He visto también la solución del otro hilo, voy a intentar adaptarla...:)

Gabo 01-03-2008 00:45:20

Sobre la otra solución:

Código SQL [-]
Select Distinct Co1.Cot,
(Select Max(Co2.Sub) from Cotizaciones Co2
 where Co1.Cot = Co2.Cot)
from Cotizaciones Co1
La adapté y quedo así:

Código SQL [-]
 
SELECT DISTINCT PRODUCTO.PRODUCTO_CODIGO, TIPO.TIPO_NOMBRE, EMPRESA.EMPRESA_NOMBRE, PRODUCTO.PRODUCTO_NOMBRE,
PRODUCTO.PRODUCTO_PRECIO, (SELECT MAX(PRODUCTO.PRODUCTO_FECHA) FROM PRODUCTO JOIN TIPO ON PRODUCTO.TIPO_CODIGO = TIPO.TIPO_CODIGO
              JOIN EMPRESA ON PRODUCTO.EMPRESA_CODIGO = EMPRESA.EMPRESA_CODIGO)
FROM PRODUCTO JOIN TIPO ON PRODUCTO.TIPO_CODIGO = TIPO.TIPO_CODIGO
              JOIN EMPRESA ON PRODUCTO.EMPRESA_CODIGO = EMPRESA.EMPRESA_CODIGO
GROUP BY PRODUCTO.PRODUCTO_CODIGO, TIPO.TIPO_NOMBRE, EMPRESA.EMPRESA_NOMBRE, PRODUCTO.PRODUCTO_NOMBRE, PRODUCTO.PRODUCTO_PRECIO

Pero el problema es que al hacer "SELECT MAX(PRODUCTO.PRODUCTO_FECHA)" le estoy diciendo arbitrariamente que coloque en todos los registros que obtenga la fecha mayor y no que muestre sólo la mayor

gluglu 01-03-2008 00:46:57

Por más que lo pienso, creo que no es posible con un simple 'Select'. :cool:

El error que indicas arriba de 'referencia de columna inválida' no es mayor problema. Bastaría incluir todos aquellos campos que no sean 'Max' en el Group By, aunque sean los respectivos nombres de empresas y tipos obtenidos de los join.

Analizando el asunto .... necesitas obtener el 'Producto_Codigo' para cada uno de los valores del Max(Fecha). Una vez que tuvieras ese 'Producto_Codigo' podrías obtener el precio correspondiente a ese registro.

Y ahí veo el problema. No sé cómo obtenerlo. :o Lo único que se me ocurre es incluir dos DataSet's en tu aplicación, uno para calcular el Max(Fecha) por cada Producto, y el segundo DataSet que sea 'detalle' del primer DataSet 'maestro', y esten referenciados por esa columna 'Maxima Fecha' obtenida. Y ya en el segundo DataSet buscas el 'Producto_Codigo' y su correspondiente 'Precio' asociado.

Si no lo haces con dos DataSet's, entonces veo la necesitad de implementar un Stored Procedure que te lo resuelva. Con ello si que no sería mayor problema.

Si a alguien se le ocurre otra solución, bienvenida sea ! :)

Gabo 01-03-2008 00:59:41

Pues yo tampoco veo muy claro el asunto. Entre las dos opciones que me das, creo que me quedo con el procedimiento almacenado.

De todas formas, lo veré mañana que ya es la 1:00 y me levanto a las 5:30 :(

¡Gracias por la ayuda gluglu! :)

Caro 01-03-2008 16:16:56

Hola Gabo

Nose si te he entendido, pero talvez podrías hacer una subconsulta para obtener las fechas maximas agrupado por tipo y empresa.

Código SQL [-]
select t.tipo_nombre, e.empresa_nombre, p.producto_codigo, p.producto_fecha, p.producto_precio
from tipo t, producto p, empresa e
where (p.tipo_codigo=t.tipo_codigo) and (p.empresa_codigo=e.empresa_codigo)
      and p.producto_fecha in (select MAX(producto_fecha)
                               from producto
                               group by tipo_codigo, empresa_codigo)


Saluditos

gluglu 01-03-2008 16:37:00

Bravo, Caro ! ;)

A primera vista me parecía que no funcionaría, pero haciendo ciertas pruebas con sets de datos propios, creo que sí, que funciona. :p

A ver si Gabo puede probar esa sentencia con sus propios datos y confirmar que el Select devuelve los datos como él desea.

gluglu 01-03-2008 16:42:57

Pues va a ser que no ....

Tal y como estoy dándole a enviar al post anterior, me doy cuenta que no funciona correctamente.

Al probarlo con mi propio set de datos, resulta que la condición del Max la estaba poniendo a un campo cuyos valores son únicos. Es decir, dos registros diferentes no pueden tener el mismo valor de ese campo.

Aplicado al ejemplo de Gabo. Si la fecha fuera única para cada registro, entonces funcionaría. En el ejemplo que ha puesto Gabo, las fechas si son únicas. Pero Gabo tendría que confirmar si en una misma fecha puede haber dos Empresas diferentes con precios diferentes.

Si fuera así, debo de entender que no funcionaría. Pero aun así, me queda la duda.

En cualquier caso, deberíamos de saber si la fecha es única. :o

gluglu 01-03-2008 17:08:46

Efectivamente, lo he probado y creo ratificarme en mi comentario anterior.

Con el set de datos de Gabo funciona perfectamente, y la lógica es correcta.

En cambio, si las fechas se pueden repetir, no funciona. Por ejemplo he probado con los siguientes registros en la Tabla Productos:

Código:

PRODUCTO
--------
21  01  11  02/12/07  23,34
22  01  12  01/12/07  20,67
23  02  11  04/12/07  56,67
24  01  11  03/12/07  26,78
25  02  11  07/12/07  34,56
26  01  12  08/12/07  56,78
27  02  11  08/12/07  99,99 
28  02  12  08/12/07  88,88
29  02  12  08/12/07  77,77

Y el resultado que obtengo con la consulta anteriormente expuesta es :

Código:

TIPO    EMPRESA    PRODUCTO    FECHA    PRECIO
--------------------------------------------------- 
PRIMERA  JB MARTINEZ 26          08/12/07  56,78
PRIMERA  COLABE      28          08/12/07  88,88
PRIMERA  COLABE      29          09/12/07  77,77
SEGUNDA  JB MARTINEZ 24          03/12/07  26,78

SEGUNDA  COLABE      27          08/12/07  99,99

Es decir, obtenemos dos registros diferentes para 'PRIMERA' y 'COLABE' porque la fecha del 08/12/07, en la cual COLABE tiene un precio, corresponde a una 'Fecha Máxima' de otro par Empresa/Tipo. Y por lo tanto me la incluye en el resultado ya que esa fecha está incluida en la subconsulta que plantea Caro.

:o

Gabo 04-03-2008 09:09:25

Hola,

antes que todo, perdón por la demora, pero el fin de semana no he estado en casa y el lunes he tenido que andar corriendo de una empresa a otra...

Gracias Caro por tu respuesta. En principio pensé que funcionaba bien, pero tal como ha dicho gluglu presenta un fallo cuando dos empresas tienen una oferta un mismo día. Puede darse el caso de que te aparezcan dos ofertas (de distinta fecha) de una empresa a un tipo de producto por encontrarse dicha fecha en el listado del primer select.

Hoy estaré liado también :(, pero mañana intentaré darle solución con un procedimiento y lo publico...

Un saludo a todos y gracias por el interés, en especial a gluglu y a Caro...
:)

Gabo 05-03-2008 10:07:12

Les cuento como quedó todo a las finales...:)

Como me apuraba un poco la solución y todavía no me manejo bien con los procedimientos (los saco pero me demoro :o) a las finales lo resolví así:

Primero ejecuto esta consulta:

Código SQL [-]
select tipo_codigo, empresa_codigo, MAX(producto_fecha)
from producto
group by tipo_codigo, empresa_codigo

Con lo que obtengo los tres datos que identifican a los registros de la tabla producto que me interesan, ya que la fecha nunca se repite para un mismo tipo y empresa. Luego con esos tres datos, obtengo el nombre del producto y su precio, el nombre del tipo y el nombre de la empresa.

No dudo que habrán modos mejores y más rápidos de implementar, pero este fue el más rápido que se me ocurrió. :p

Gracias a todos nuevamente... :)


La franja horaria es GMT +2. Ahora son las 18:27:26.

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