Ver Mensaje Individual
  #6 (permalink)  
Antiguo 16/03/2012, 16:14
leonardo_josue
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: SQL para obtener últimos registros

Hola de nuevo:

Si entendí correctamente y partiendo de los datos que estás poniendo de ejemplo hay un error en la salida que estás esperando, dices que esperas estos resultados.

Código:
CLIENTE|ATIENDE|FECHA_LLAM      |FECHA_SERV  |SERVICIO
123    |JUAN   |2011-11-03 08:40|2011-12-07  |FRENOS
1058   |RINGO  |2011-11-12 09:00|2011-11-06  |FRENOS
Sin embargo, si revisas tus tablas, la fecha 2011-11-06 aparece para los servicios 4 y 5

SERVICIO
id | fecha |cliente
4 |2011-11-06|128
5 |2011-11-06|1058

Pero en la tabla CONT_SERVICIOS no se indica que alguno de estos servicios sea ACEITE:

Código:
CONT_SERVICIO
id |servicio| id_serv|
6  |VALVULA |4
7  |FRENOS  |5
Este pequeño error me trajo de cabeza un buen rato, porque creí que la consulta que estaba haciendo estaba mal... supongo que te confundiste con este registro:

Código:
CONT_SERVICIOS
4  |ACEITE  |3
Si estoy en lo correcto, el resultado que debería arrojar la consulta es

Código:
+---------+---------+---------------------+------------+----------+
| cliente | atiende | fecha_llama         | fecha_serv | servicio |
+---------+---------+---------------------+------------+----------+
|     123 | JUAN    | 2011-11-03 08:40:00 | 2011-02-06 | ACEITE   |
|    1058 | RINGO   | 2011-11-12 09:00:00 | 2011-08-19 | ACEITE   |
+---------+---------+---------------------+------------+----------+
En fin, si estoy equivocado me lo comentas...

Sigo pensando que tienes un mal modelo de datos, pero en vista que dices que es correcto, pues al cliente lo que pida... una forma de obtener el resultado esperado sería así:

Código MySQL:
Ver original
  1. mysql> SELECT l.cliente, l.atiende, T2.max_fecha fecha_llama,
  2.     ->    T1.max_fecha fecha_serv, T1.servicio
  3.     -> FROM llamadas l
  4.     -> INNER JOIN
  5.     -> (
  6.     ->    SELECT MAX(fecha) max_fecha, cliente, cs.servicio
  7.     ->    FROM servicios s
  8.     ->    INNER JOIN cont_servicio cs ON cs.id_serv = s.id
  9.     ->    WHERE cs.servicio = 'ACEITE'
  10.     ->    GROUP BY s.cliente, cs.servicio
  11.     -> ) T1 ON l.cliente = T1.cliente
  12.     -> INNER JOIN
  13.     -> (
  14.     ->    SELECT MAX(fecha) max_fecha, cliente
  15.     ->    FROM llamadas
  16.     ->    GROUP BY cliente
  17.     -> ) T2 ON T2.max_fecha = L.fecha AND T2.cliente = l.cliente;
  18. +---------+---------+---------------------+------------+----------+
  19. | cliente | atiende | fecha_llama         | fecha_serv | servicio |
  20. +---------+---------+---------------------+------------+----------+
  21. |     123 | JUAN    | 2011-11-03 08:40:00 | 2011-02-06 | ACEITE   |
  22. |    1058 | RINGO   | 2011-11-12 09:00:00 | 2011-08-19 | ACEITE   |
  23. +---------+---------+---------------------+------------+----------+
  24. 2 rows in set (0.02 sec)

Puedes ejecutar cada subconsulta por separado para que entiendas la lógica que seguí para filtrar la información. cualquier duda o comentario lo comentas en el foro... igual y por el puente no tengo chance de contestarte hasta el próximo martes, pero espero que te sea de utilidad.

Saludos
Leo.