Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Ayuda en query

Estas en el tema de Ayuda en query en el foro de Mysql en Foros del Web. Hola a todos, Estoy intentando hacer una query y no consigo el resultado que necesito. Imagino que será sencillo, pero no doy con ello :( ...
  #1 (permalink)  
Antiguo 24/05/2010, 04:48
 
Fecha de Ingreso: noviembre-2007
Mensajes: 4
Antigüedad: 16 años, 5 meses
Puntos: 0
Ayuda en query

Hola a todos,

Estoy intentando hacer una query y no consigo el resultado que necesito.

Imagino que será sencillo, pero no doy con ello :(

A ver si se os ocurre alguna idea.

Tengo una tabla donde se almacenan los datos de clientes.
En concreto los campos son:
Client_id; account_manager; sales_manager; date

Se van guardando los datos de cada día, de modo que por ejemplo tengo un listado como este:
Client_id; account_manager; sales_manager; date
1; fernandez; rodriguez; 2010-05-19
1; gomez; dominguez; 2010-05-17
2; gomez; dominguez; 2010-05-18
2; gomez; dominguez; 2010-05-17

A mí lo que me interesa es que la query me devuelva el listado de registros por cliente, pero solo el último día que ese cliente tiene un registro.

Por ejemplo, en las tres filas que he pegado antes, hay dos líneas para el cliente 1, una para el día 19 y otra para el día 17. De un día a otro el account_manager y el sales_manager han cambiado.
Lo que yo quiero ver es quién es el account_manager y el sales_manager más reciente.
En el cliente 2 hay también dos registros de dos días distintos, pero el account_manager y el sales_manager no han cambiado.
Por lo tanto como resultado de la query me tendría que dar:

Client_id; account_manager; sales_manager; date
1; fernandez; rodriguez; 2010-05-19
2; gomez; dominguez; 2010-05-18

Es decir, la query toma la tabla original y dice: select cada client_id y dame el account_manager y el sales_manager del último día en que haya un registro para ese cliente.

Hasta ahora la query sería algo así:

SELECT client_management.Client_id, client_management.account_manager, client_management.sales_manager, Max(client_management.Date) AS [MaxOfDate]
FROM client_management
GROUP BY client_management.Client_id, client_management.account_manager, client_management.sales_manager
ORDER BY client_management.Client_id, Max(crm_am_test.Date) DESC;

El problema es que esto me da como resultado:

Client_id; account_manager; sales_manager; date
1; fernandez; rodriguez; 2010-05-19
1; gomez; dominguez; 2010-05-17
2; gomez; dominguez; 2010-05-18

Es decir, al agrupar los resultados por client_id, de forma correcta me devuelve el cliente 2 solo una vez con los valores para el último día donde hay datos (18 Mayo) y porque en la tabla original el cliente 2 tiene los mismos valores de account_manager y sales_manager en ambos días en que aparece.
Sin embargo, el cliente 1 aparece dos veces, ya que los valores de account_manager y sales_manager han cambiado de un día a otro.

Y sin embargo, yo no quiero que me salga el cliente 1 dos veces, sino solo una línea por cada cliente que hay en la tabla original, con los valores de account_manager y sales_manager en el último día en que hubo registros para ese cliente.

He intentado explicarme lo mejor posible, espero que se haya entendido.

¿Alguien tiene alguna sugerencia?

Mil gracias,
Martape
  #2 (permalink)  
Antiguo 24/05/2010, 05:29
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Ayuda en query

Código MySQL:
Ver original
  1. SELECT client_management.Client_id,
  2.              Max(client_management.Date) AS [MaxOfDate]
  3. FROM client_management
  4. GROUP BY client_management.Client_id

Primero obtenemos la fecha maxima para cada cliente

Código MySQL:
Ver original
  1. SELECT cm.Client_id, cm.account_manager, cm.sales_manager, sbc.MaxOfDate
  2. FROM client_management as cm INNER JOIN
  3. (SELECT client_management.Client_id,
  4.              Max(client_management.Date) AS [MaxOfDate]
  5.     FROM client_management
  6.     GROUP BY client_management.Client_id) as Sbc
  7. ON   cm.Client_id=sbc.Client_id AND cm.Date=sbc.MaxOfDate

Puedes tener un problema irresoluble si tienes un caso como el siguiente

1; fernandez; rodriguez; 2010-05-19
1; gomez; dominguez; 2010-05-19

Si no se da o el campo date incluye la hora no seria problema...

Quim

Yo no usaria DATE como nombre de campo es una palabra reservada y te podria dar problemas en algun contexto
  #3 (permalink)  
Antiguo 24/05/2010, 05:58
 
Fecha de Ingreso: noviembre-2007
Mensajes: 4
Antigüedad: 16 años, 5 meses
Puntos: 0
Respuesta: Ayuda en query

Perfecto!

Ese caso que comentas no se puede presentar, así que ningún problema con eso.

Tomaré el consejo del nombre de campo "Date", es cierto que alguna vez me ha dado algún problemilla, así que lo cambiaré.

Mil gracias por la ayuda,
Martape

Etiquetas: query
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:17.