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

[SOLUCIONADO] Consultar cliente actual con los máximos movimientos

Estas en el tema de Consultar cliente actual con los máximos movimientos en el foro de Mysql en Foros del Web. Hola de nuevo a todos. Vengo pidiendo ayuda de un problema que no me deja en paz. Y creo que no me han podido ayudar ...
  #1 (permalink)  
Antiguo 28/05/2015, 12:25
Avatar de planmental  
Fecha de Ingreso: abril-2015
Mensajes: 100
Antigüedad: 9 años
Puntos: 0
Consultar cliente actual con los máximos movimientos

Hola de nuevo a todos.

Vengo pidiendo ayuda de un problema que no me deja en paz.

Y creo que no me han podido ayudar porque no me he podido explicar bien.

Pero va de nuevo pero ahora detallando muy bien lo que necesito.

Necesito saber el primer movimiento del cliente actual en una tabla.

Pero no necesito el primer movimiento de todo el historial, sino que quiero saber cuándo empezó a hacer los movimientos para empezar a contar los días de dichos movimientos.

En el siguiente enlace muestro un ejemplo de lo que necesito, pero el problema es que me da el último id que se registró:

http://sqlfiddle.com/#!9/6a212/1

Lo que yo necesito es desde cuando se empezó a realizar los movimientos.

En este ejemplo el resultado que me da es:

Código:
traslado_id   |	remolque_otros	   |     servicio_id   |	fecha_servicio
7	      |        99999	   |         17        |	June, 07 2015 00:00:00

Pero lo que yo necesito es que me de el resultado:

Código:
traslado_id   |	remolque_otros	   |     servicio_id   |	fecha_servicio
5	      |        99999	   |         15        |	May, 05 2015 00:00:00
En pocas palabras es que me consulte el último cliente que ha hecho movimientos con ese remolque y que "colisione" con el cliente anterior pues si continua me va a dar fechas anteriores pues ese cliente ya había hecho movimientos.

No sé si me explico.

No hagan trampa colocando WHERE traslado_id = 5 o WHERE servicio_id = 15 pues no siempre es lo mismo.

Gracias de nuevo
  #2 (permalink)  
Antiguo 28/05/2015, 12:43
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Consultar cliente actual con los máximos movimientos

finalmente te entendi :)

lo que quieres es esto:

id | cliente | fecha
------------------------------
1 | v1 | 2015-05-20
2 | v1 | 2015-05-20
3 | v1 | 2015-05-01
4 | v1 | 2015-03-05
5 | v2 | 2015-02-02
6 | v3 | 2015-01-30
7 | v1 | 2015-01-01

de ahi tomarias ese registro del V1 porque es el primero despues de que hubo registros de V2 y V3 correcto??? en este caso si tuvieramos


id | cliente | fecha
------------------------------
1 | v1 | 2015-05-20
2 | v1 | 2015-05-20
3 | v1 | 2015-05-01
4 | v2 | 2015-03-05
5 | v2 | 2015-02-02
6 | v3 | 2015-01-30
7 | v1 | 2015-01-01

Te interesaria el registro 3 correcto???
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 28/05/2015, 12:45
Avatar de planmental  
Fecha de Ingreso: abril-2015
Mensajes: 100
Antigüedad: 9 años
Puntos: 0
Respuesta: Consultar cliente actual con los máximos movimientos

Exacto!

Es lo que busco!!!
  #4 (permalink)  
Antiguo 28/05/2015, 12:54
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Consultar cliente actual con los máximos movimientos

Codigo SQL server

Código SQL:
Ver original
  1. CREATE TABLE #temp
  2. (
  3. id INT,
  4. cliente VARCHAR(10),
  5. fecha datetime
  6. )
  7.  
  8.  
  9. INSERT INTO #temp VALUES (1 ,'v1','2015-05-20')
  10. INSERT INTO #temp VALUES (2 ,'v1','2015-05-20')
  11. INSERT INTO #temp VALUES (3 ,'v1','2015-05-01')
  12. INSERT INTO #temp VALUES (4 ,'v1','2015-03-05')
  13. INSERT INTO #temp VALUES (5 ,'v2','2015-02-02')
  14. INSERT INTO #temp VALUES (6 ,'v3','2015-01-30')
  15. INSERT INTO #temp VALUES (7 ,'v1','2015-01-01')
  16.  
  17. SELECT calculo, id,cliente FROM(
  18. SELECT CASE WHEN t1.cliente<>t2.cliente THEN t2.fecha END AS calculo, t1.id AS id,t1.cliente AS cliente FROM #temp AS t1
  19. INNER JOIN #temp AS t2 ON (t1.id+1=t2.id)
  20. ) AS t3 WHERE calculo IS NOT NULL

Resultado:

calculo id cliente
2015-02-02 00:00:00.000 4 v1
2015-01-30 00:00:00.000 5 v2
2015-01-01 00:00:00.000 6 v3
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #5 (permalink)  
Antiguo 28/05/2015, 15:32
Avatar de planmental  
Fecha de Ingreso: abril-2015
Mensajes: 100
Antigüedad: 9 años
Puntos: 0
Respuesta: Consultar cliente actual con los máximos movimientos

Gracias Libras.

Aunque aún no encuentro cómo acoplarlo a mi código
  #6 (permalink)  
Antiguo 28/05/2015, 16:26
 
Fecha de Ingreso: febrero-2015
Mensajes: 89
Antigüedad: 9 años, 2 meses
Puntos: 1
Respuesta: Consultar cliente actual con los máximos movimientos

La verdad no entiendo el motivo de porque haces eso, pero es tu rollo xd
no le veo sentido a coger el registro de esa forma.

Pero Aqui te dejo el query que tanto quieres xD

Código SQL:
Ver original
  1. SELECT (CASE WHEN A.cliente_id = B.cliente_id THEN A.fecha_servicio
  2.        ELSE 0 END)  AS fecha, A.*
  3. FROM (SELECT  a.*, c.* FROM cliente a INNER JOIN servicio b
  4. ON a.cliente_id = b.cliente_id
  5. INNER JOIN traslado c ON b.servicio_id = c.servicio_id
  6.       WHERE A.alias = 'cliente1'
  7.       ORDER BY traslado_id DESC
  8. ) A
  9. INNER JOIN
  10. (SELECT  a.*, c.* FROM cliente a INNER JOIN servicio b
  11. ON a.cliente_id = b.cliente_id
  12. INNER JOIN traslado c ON b.servicio_id = c.servicio_id
  13.       WHERE A.alias = 'cliente1'
  14.  ORDER BY traslado_id DESC
  15. ) B
  16. ON A.traslado_id   = B.traslado_id -1
  17. ORDER BY fecha ASC LIMIT 1


Copia y pega al ejemplo que dejaste.
Salu2
  #7 (permalink)  
Antiguo 28/05/2015, 16:36
Avatar de planmental  
Fecha de Ingreso: abril-2015
Mensajes: 100
Antigüedad: 9 años
Puntos: 0
Respuesta: Consultar cliente actual con los máximos movimientos

Cita:
Iniciado por jmendezg Ver Mensaje
La verdad no entiendo el motivo de porque haces eso, pero es tu rollo xd
no le veo sentido a coger el registro de esa forma.

Pero Aqui te dejo el query que tanto quieres xD

Código SQL:
Ver original
  1. SELECT (CASE WHEN A.cliente_id = B.cliente_id THEN A.fecha_servicio
  2.        ELSE 0 END)  AS fecha, A.*
  3. FROM (SELECT  a.*, c.* FROM cliente a INNER JOIN servicio b
  4. ON a.cliente_id = b.cliente_id
  5. INNER JOIN traslado c ON b.servicio_id = c.servicio_id
  6.       WHERE A.alias = 'cliente1'
  7.       ORDER BY traslado_id DESC
  8. ) A
  9. INNER JOIN
  10. (SELECT  a.*, c.* FROM cliente a INNER JOIN servicio b
  11. ON a.cliente_id = b.cliente_id
  12. INNER JOIN traslado c ON b.servicio_id = c.servicio_id
  13.       WHERE A.alias = 'cliente1'
  14.  ORDER BY traslado_id DESC
  15. ) B
  16. ON A.traslado_id   = B.traslado_id -1
  17. ORDER BY fecha ASC LIMIT 1


Copia y pega al ejemplo que dejaste.
Salu2
Hola jmendezg.

La verdad es que sí hay razón para hacer eso tan raro jaja.

Muchas gracias por el código pero cuando lo intento poner en mi código real me sale un error en A.alias

Aquí mi código

Código MySQL:
Ver original
  1. SELECT (CASE WHEN A.cliente_id = B.cliente_id THEN A.fecha_servicio
  2.        ELSE 0 END)  AS fecha, A.*
  3. FROM (SELECT  a.*, c.* FROM cliente a INNER JOIN servicio b
  4. ON a.cliente_id = b.cliente_id
  5. INNER JOIN traslado c ON b.servicio_id = c.servicio_id
  6.       WHERE A.alias = "'.$cliente.'"
  7.       ORDER BY traslado_id DESC
  8. ) A
  9. (SELECT  a.*, c.* FROM cliente a INNER JOIN servicio b
  10. ON a.cliente_id = b.cliente_id
  11. INNER JOIN traslado c ON b.servicio_id = c.servicio_id
  12.       WHERE A.alias = "'.$cliente.'"
  13.  ORDER BY traslado_id DESC
  14. ) B
  15. ON A.traslado_id   = B.traslado_id -1

Lo más raro es que estoy usando esta consulta también :

Código MySQL:
Ver original
  1. SELECT traslado.* FROM traslado
  2. INNER JOIN servicio
  3. ON traslado.servicio_id = servicio.servicio_id
  4.  
  5. INNER JOIN cliente
  6. ON servicio.cliente_id = cliente.cliente_id
  7.  
  8.  
  9. WHERE cliente.alias = 'cliente1'
  10. AND NOT EXISTS ( SELECT cliente.alias
  11.                        FROM traslado T4
  12.                        
  13.                        INNER JOIN servicio
  14. ON T4.servicio_id = servicio.servicio_id
  15.  
  16. INNER JOIN cliente C4
  17. ON servicio.cliente_id = C4.cliente_id
  18.  WHERE C4.alias != cliente.alias
  19.                 AND T4.fecha_servicio > traslado.fecha_servicio)
  20.                
  21. GROUP BY cliente.alias
  22. ORDER BY traslado_id DESC  LIMIT 1

Me sale el resultado que quiero pero cuando lo pongo en mi código real no me sale lo mismo jaja

Última edición por planmental; 28/05/2015 a las 16:47
  #8 (permalink)  
Antiguo 29/05/2015, 10:23
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Consultar cliente actual con los máximos movimientos

Hola de nuevo planmental:

Creo que la solución que te había dado en en post que publicaste hace algunos días es válido:

http://www.forosdelweb.com/f86/tomar...campo-1128530/


Siguiendo la misma lógica y a partir del ejercicio que pones de ejemplo, la consulta quedaría así:

Código MySQL:
Ver original
  1. SELECT s.cliente_id, MIN(T.fecha_servicio) minimo
  2. FROM traslado T
  3. INNER JOIN servicio S ON T.servicio_id = S.servicio_id
  4. (  SELECT DISTINCT S1.cliente_id
  5.    FROM traslado T1
  6.    INNER JOIN servicio S1 ON T1.servicio_id = S1.servicio_id
  7.    INNER JOIN ( SELECT MAX(T2.fecha_servicio) ultimo
  8.                 FROM traslado T2 ) T3 on T3.ultimo = T1.fecha_servicio ) T4 ON T4.cliente_id = S.cliente_id
  9.              FROM traslado T5
  10.              INNER JOIN servicio S5 ON T5.servicio_id = S5.servicio_id
  11.              WHERE S5.cliente_id != S.cliente_id AND T5.fecha_servicio > T.fecha_servicio);

Esta consulta te arroja como resultado el cliente 111 (cliente 1) y la fecha
2015-05-05... Si necesitas información adicional de tus otras tablas, simplemente tienes que usar esta consulta para filtrar...

Dale un vistazo para ver si es lo que necesitas,

Saludos
Leo
  #9 (permalink)  
Antiguo 29/05/2015, 12:19
Avatar de planmental  
Fecha de Ingreso: abril-2015
Mensajes: 100
Antigüedad: 9 años
Puntos: 0
Respuesta: Consultar cliente actual con los máximos movimientos

Cita:
Iniciado por leonardo_josue Ver Mensaje
Hola de nuevo planmental:

Creo que la solución que te había dado en en post que publicaste hace algunos días es válido:

http://www.forosdelweb.com/f86/tomar...campo-1128530/


Siguiendo la misma lógica y a partir del ejercicio que pones de ejemplo, la consulta quedaría así:

Código MySQL:
Ver original
  1. SELECT s.cliente_id, MIN(T.fecha_servicio) minimo
  2. FROM traslado T
  3. INNER JOIN servicio S ON T.servicio_id = S.servicio_id
  4. (  SELECT DISTINCT S1.cliente_id
  5.    FROM traslado T1
  6.    INNER JOIN servicio S1 ON T1.servicio_id = S1.servicio_id
  7.    INNER JOIN ( SELECT MAX(T2.fecha_servicio) ultimo
  8.                 FROM traslado T2 ) T3 on T3.ultimo = T1.fecha_servicio ) T4 ON T4.cliente_id = S.cliente_id
  9.              FROM traslado T5
  10.              INNER JOIN servicio S5 ON T5.servicio_id = S5.servicio_id
  11.              WHERE S5.cliente_id != S.cliente_id AND T5.fecha_servicio > T.fecha_servicio);

Esta consulta te arroja como resultado el cliente 111 (cliente 1) y la fecha
2015-05-05... Si necesitas información adicional de tus otras tablas, simplemente tienes que usar esta consulta para filtrar...

Dale un vistazo para ver si es lo que necesitas,

Saludos
Leo
Hola Leo, te agradezco tu atención

Probé tu código pero me sale resultado nulo cuando lo escribo en mi código real.

Aquí sí me sale bien, pero mi duda es por qué no pusiste la tabla clientes.

http://sqlfiddle.com/#!9/d246e/16

Última edición por planmental; 29/05/2015 a las 12:24
  #10 (permalink)  
Antiguo 29/05/2015, 12:24
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Consultar cliente actual con los máximos movimientos

Cita:
Iniciado por planmental Ver Mensaje
Hola Leo, te agradezco tu atención

Probé tu código pero me sale resultado nulo cuando lo escribo en mi código real.

Aquí sí me sale bien, pero mi duda es por qué no pusiste la tabla clientes.

http://sqlfiddle.com/#!9/d246e/15
Eso lo tendrias que hacer tu, no esperes que se te resuelva la duda puntual......
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #11 (permalink)  
Antiguo 29/05/2015, 12:26
Avatar de planmental  
Fecha de Ingreso: abril-2015
Mensajes: 100
Antigüedad: 9 años
Puntos: 0
Respuesta: Consultar cliente actual con los máximos movimientos

Lo que pasa es que no entiendo por qué sin escribir la tabla clientes sale el resultado.
  #12 (permalink)  
Antiguo 29/05/2015, 12:38
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Consultar cliente actual con los máximos movimientos

Hola de nuevo:

La tabla SERVICIO ya tiene la clave del cliente, luego entonces no es necesario la tabla de CLIENTES para obtener este mismo dato... Si quisieras mostrar el alias del cliente, entonces si es necesario incluir esa tabla...

Saludos
Leo.
  #13 (permalink)  
Antiguo 29/05/2015, 16:14
Avatar de planmental  
Fecha de Ingreso: abril-2015
Mensajes: 100
Antigüedad: 9 años
Puntos: 0
Respuesta: Consultar cliente actual con los máximos movimientos

Hola leonardo_josue

Déjame decirte que te debo la vida

Moviéndole pude hacer esta consulta:

Código MySQL:
Ver original
  1. SELECT C.cliente_id, MIN(T.fecha_servicio) minimo, T.remolque_otros
  2. FROM traslado T
  3. INNER JOIN servicio S ON T.servicio_id = S.servicio_id
  4. INNER JOIN cliente C ON S.cliente_id = C.cliente_id
  5. (  SELECT DISTINCT S1.cliente_id, T1.fecha_servicio
  6.    FROM traslado T1
  7.    INNER JOIN servicio S1 ON T1.servicio_id = S1.servicio_id
  8.    INNER JOIN cliente C1 ON S1.cliente_id = C1.cliente_id
  9.    INNER JOIN ( SELECT MAX(T2.fecha_servicio) ultimo, remolque_otros
  10.                 FROM traslado T2
  11.                
  12. INNER JOIN servicio S ON T2.servicio_id = S.servicio_id
  13. INNER JOIN cliente C1 ON S.cliente_id = C1.cliente_id
  14. WHERE T2.remolque_otros = "'.$_GET['s'].'"
  15.                
  16.                 ) T3 on T3.ultimo = T1.fecha_servicio ) T4 ON T4.cliente_id = S.cliente_id
  17.     AND NOT EXISTS ( SELECT *
  18.              FROM traslado T5
  19.              INNER JOIN servicio S5 ON T5.servicio_id = S5.servicio_id
  20.              INNER JOIN cliente C5 ON S5.cliente_id = C5.cliente_id WHERE T5.remolque_otros = "'.$_GET['s'].'"
  21.              AND S5.cliente_id != S.cliente_id AND T5.fecha_servicio > T.fecha_servicio )          
  22.                
  23.     WHERE T.remolque_otros = "'.$_GET['s'].'"
  24.  
  25.              LIMIT 1

Y me funcionó justamente como lo quería.

Le estuve moviendo desde que me lo pasaste y si te fijas la hora de diferencia fue eso lo que me tardé. Jaja

MUCHAS GRACIAS!!!

Última edición por planmental; 29/05/2015 a las 16:37

Etiquetas: actual, cliente, consultar, fecha, sql, tabla
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 16:52.