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

devolver la diferencia de valor entre una fila siguente

Estas en el tema de devolver la diferencia de valor entre una fila siguente en el foro de Mysql en Foros del Web. Hola, puede alguien darme una manito con la siguiente consulta: si tengo el siguiente listado kilometros | fecha 1000 | 01/01/11 1200 |03/01/11 1250 |11/01/11 ...
  #1 (permalink)  
Antiguo 26/07/2011, 14:28
 
Fecha de Ingreso: julio-2009
Mensajes: 90
Antigüedad: 14 años, 8 meses
Puntos: 4
devolver la diferencia de valor entre una fila siguente

Hola, puede alguien darme una manito con la siguiente consulta:

si tengo el siguiente listado


kilometros | fecha
1000 | 01/01/11
1200 |03/01/11
1250 |11/01/11
1500 |02/02/11
1800 |15/02/11


como puedo hacer una consulta para obtener lo siguiente:

km recorrido | fecha
0 |01/01/11
200 |03/01/11
50 |11/01/11
250 |02/02/11
300 |15/02/11

o sea los kilómetros recorridos entre una fecha y la anterior. He buscado y hecho pruebas pero no logro dar con consultas similares y mi conocimiento de MySql es básico

Cualquier ayuda sera agradecida
__________________
C[^L*]D
[email protected]
tokkaido.blogspot.com
No hay mejor forma de aprender que enseñar
  #2 (permalink)  
Antiguo 26/07/2011, 15:09
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: devolver la diferencia de valor entre una fila siguente

Hola tokkaido:

No me gustaría simplemente darte la respuesta, así es que te ayudo con la parte que creo te puede traer más problemas y te toca completarla, de acuerdo?

Checa este script:

Código MySQL:
Ver original
  1. mysql> CREATE TABLE TuTabla (kilometros INT, fecha DATE);
  2. Query OK, 0 rows affected (0.13 sec)
  3.  
  4. mysql> INSERT INTO TuTabla VALUES (1000, '2011-01-01'), (1200, '2011-01-03'),
  5.     -> (1250, '2011-01-11'),(1500, '2011-02-02'),(1800, '2011-02-15');
  6. Query OK, 5 rows affected (0.08 sec)
  7. Records: 5  Duplicates: 0  Warnings: 0
  8.  
  9. mysql> select * from TuTabla;
  10. +------------+------------+
  11. | kilometros | fecha      |
  12. +------------+------------+
  13. |       1000 | 2011-01-01 |
  14. |       1200 | 2011-01-03 |
  15. |       1250 | 2011-01-11 |
  16. |       1500 | 2011-02-02 |
  17. |       1800 | 2011-02-15 |
  18. +------------+------------+
  19. 5 rows in set (0.00 sec)
  20.  
  21. mysql> SELECT
  22.     -> kilometros ,
  23.     -> (SELECT MAX(kilometros) FROM TuTabla
  24.     -> WHERE fecha < T1.fecha) kilometros_a_restar
  25.     -> FROM TuTabla T1;
  26. +------------+---------------------+
  27. | kilometros | kilometros_a_restar |
  28. +------------+---------------------+
  29. |       1000 |                NULL |
  30. |       1200 |                1000 |
  31. |       1250 |                1200 |
  32. |       1500 |                1250 |
  33. |       1800 |                1500 |
  34. +------------+---------------------+
  35. 5 rows in set (0.00 sec)
  36.  
  37. mysql>


Como verás, si restas las dos columnas prácticamente tienes el resultado, es decir, para cada registro estoy buscando mediante una subconsulta el inmediato anterior (con la función MAX(fecha) y la condición WHERE). el único detalle que faltaría sería para el primer registro, ya que si haces la resta el resultado será un NULL

Código MySQL:
Ver original
  1. mysql> SELECT
  2.     -> kilometros -
  3.     -> (SELECT MAX(kilometros) FROM TuTabla
  4.     -> WHERE fecha < T1.fecha) kilometros
  5.     -> FROM TuTabla T1;
  6. +---------------------+
  7. | kilometros          |
  8. +---------------------+
  9. |                NULL |
  10. |                 200 |
  11. |                  50 |
  12. |                 250 |
  13. |                 300 |
  14. +---------------------+
  15. 5 rows in set (0.00 sec)

Te tocaría validar que cuando el resultado de la subconsulta sea un null lo reemplace con 0. Espero que con eso no tendrás problemas.

Saludos
Leo.
  #3 (permalink)  
Antiguo 26/07/2011, 19:25
Avatar de leocente  
Fecha de Ingreso: diciembre-2009
Mensajes: 62
Antigüedad: 14 años, 3 meses
Puntos: 4
Respuesta: devolver la diferencia de valor entre una fila siguente

Para eliminar el "null" de la consulta se me ocurre lo siguiente

Código MySQL:
Ver original
  1. select if(kilometro-(select max(kilometro) from TuTabla where fecha<T1.fecha) is null,0,kilometro-(select max(kilometro) from TuTabla where fecha<T1.fecha)) as 'kilometro',fecha from TuTabla T1;

Saludos a tu hermana! jaj na mentira, que andes bien!
  #4 (permalink)  
Antiguo 27/07/2011, 07:53
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: devolver la diferencia de valor entre una fila siguente

Jejeje, yo que quería que tokkaido completara la consulta por su cuenta, pero ya leocente dió la respuesta... eso era justamente lo que quería que intentaras hacer.

también podrías hacerlo así:

Código MySQL:
Ver original
  1. mysql> SELECT
  2.     -> if ((SELECT MAX(kilometros) FROM TuTabla
  3.     -> WHERE fecha < T1.fecha) is null, 0, kilometros -
  4.     -> (SELECT MAX(kilometros) FROM TuTabla
  5.     -> WHERE fecha < T1.fecha)) kilometros_recorridos
  6.     -> FROM TuTabla T1;
  7. +-----------------------+
  8. | kilometros_recorridos |
  9. +-----------------------+
  10. |                     0 |
  11. |                   200 |
  12. |                    50 |
  13. |                   250 |
  14. |                   300 |
  15. +-----------------------+
  16. 5 rows in set (0.13 sec)

o utilizando CASE-WHEN

Código MySQL:
Ver original
  1. mysql> SELECT
  2.     -> CASE WHEN (SELECT MAX(kilometros) FROM TuTabla
  3.     -> WHERE fecha < T1.fecha) is null THEN 0 ELSE kilometros -
  4.     -> (SELECT MAX(kilometros) FROM TuTabla
  5.     -> WHERE fecha < T1.fecha) END kilometros_recorridos
  6.     -> FROM TuTabla T1;
  7. +-----------------------+
  8. | kilometros_recorridos |
  9. +-----------------------+
  10. |                     0 |
  11. |                   200 |
  12. |                    50 |
  13. |                   250 |
  14. |                   300 |
  15. +-----------------------+
  16. 5 rows in set (0.00 sec)

Saludos
Leo.
  #5 (permalink)  
Antiguo 27/07/2011, 08:24
 
Fecha de Ingreso: julio-2009
Mensajes: 90
Antigüedad: 14 años, 8 meses
Puntos: 4
Respuesta: devolver la diferencia de valor entre una fila siguente

Muchisimas gracias a ambos por responder tan rápido, me han hecho un gran favor! no pude responderles antes por un corte de energía generalizado en la oficina por lo que a nosotros los informáticos solo nos queda irnos a casita temprano, jajaja, al final mi consulta quedo asi:

Código:
SELECT
		T1.kilometros -
		(SELECT 
				MAX(T2.kilometros) 
		FROM 
				TuTabla AS T2
		WHERE 
                                fecha < T1.fecha) AS kilometros_a_restar,
		fecha
FROM 
		TuTabla AS T1;
con respecto a los campos null no hay problema porque el kilometraje inicial lo tomo de otra tabla

otra vez, muy agradecido:

leonardo tu galleta de la fortuna para hoy dice: Recibiras una sorpresa maravillosa este día
__________________
C[^L*]D
[email protected]
tokkaido.blogspot.com
No hay mejor forma de aprender que enseñar

Etiquetas: kilometros, restar
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 00:53.