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

intercalar resultados de un union all

Estas en el tema de intercalar resultados de un union all en el foro de Mysql en Foros del Web. el titulo es un poco capcioso porque la lógica me dice que no se puede pero lo que intento hacer es lo sgte: hago esta ...
  #1 (permalink)  
Antiguo 13/04/2010, 17:12
 
Fecha de Ingreso: julio-2009
Mensajes: 90
Antigüedad: 15 años, 3 meses
Puntos: 4
Pregunta intercalar resultados de un union all

el titulo es un poco capcioso porque la lógica me dice que no se puede pero lo que intento hacer es lo sgte:

hago esta consulta:

Código MySQL:
Ver original
  1. (SELECT vale,vehiculo,kms,vale_fecha,fecha_ent fecha,'Entrante' movimiento FROM historico_neumaticos WHERE cod_ent=2595) union all
  2. (SELECT vale,vehiculo,kms,vale_fecha,fecha_sal fecha,'Saliente' movimiento FROM historico_neumaticos WHERE cod_sal=2595)

que me da como resultado registros 'Entrante' primero y 'Saliente' despues, pero necesito que me salgan intercalados y ordenados por el campo vale, entonces intente esto:

Código MySQL:
Ver original
  1. SELECT vale,vehiculo,kms,vale_fecha,fecha,movimiento from
  2. (SELECT vale,vehiculo,kms,vale_fecha,fecha_ent fecha,'Entrante' movimiento FROM historico_neumaticos WHERE cod_ent=2595)e union all
  3. (SELECT vale,vehiculo,kms,vale_fecha,fecha_sal fecha,'Saliente' movimiento FROM historico_neumaticos WHERE cod_sal=2595)s

pero me da error, hay alguna forma inteligente de hacer esta consulta?

cualquier luz será agradecida
__________________
C[^L*]D
[email protected]
tokkaido.blogspot.com
No hay mejor forma de aprender que enseñar
  #2 (permalink)  
Antiguo 14/04/2010, 01:08
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 7 meses
Puntos: 300
Respuesta: intercalar resultados de un union all

Prueba así:
(SELECT vale, vehiculo, kms, vale_fecha, fecha_ent fecha,'Entrante' movimiento FROM historico_neumaticos WHERE cod_ent=2595)
UNION all
(SELECT vale, vehiculo, kms, vale_fecha, fecha_sal fecha,'Saliente' movimiento FROM historico_neumaticos WHERE cod_sal=2595) ORDER BY vale
  #3 (permalink)  
Antiguo 14/04/2010, 04:55
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 8 meses
Puntos: 574
Respuesta: intercalar resultados de un union all

Código MySQL:
Ver original
  1. SELECT sbc.vale,
  2.              sbc.vehiculo,
  3.              sbc.kms,
  4.              sbc.vale_fecha,
  5.              sbc.fecha,
  6.              sbc.movimiento
  7. FROM (SELECT h1.vale,
  8.                         h1.vehiculo,
  9.                         h1.kms,
  10.                         h1.vale_fecha,
  11.                         h1.fecha_ent fecha,
  12.                         'Entrante' movimiento
  13.             FROM historico_neumaticos h1
  14.             WHERE h1.cod_ent=2595
  15.             UNION all
  16.             SELECT h2.vale,
  17.                          h2.vehiculo,
  18.                          h2.kms,
  19.                          h2.vale_fecha,
  20.                          h2.fecha_sal fecha,
  21.                          'Saliente' movimiento
  22.             FROM historico_neumaticos h2
  23.             WHERE h2.cod_sal=2595) sbc
  24. ORDER BY sbc.vale,sbc.movimiento;


Creo.

Quim
  #4 (permalink)  
Antiguo 14/04/2010, 10:01
 
Fecha de Ingreso: julio-2009
Mensajes: 90
Antigüedad: 15 años, 3 meses
Puntos: 4
Respuesta: intercalar resultados de un union all

las 2 soluciones me funcionan de maravilla, mas la de quimfv me parece la mas adecuada para lo sgte que necesito hacer:

me gustaría agregar un campo más al resultado que me diera la diferencia entre los kms de cuando el neumático entró a ese vehículo, o sea marcado "entrante" hasta que salió , o sea marcado "saliente", pero por más que le doy vueltas no logro encontrar la forma.

he intentado algo como esto:

Código MySQL:
Ver original
  1. sbc.vale,
  2. sbc.vehiculo,
  3. sbc.kms,
  4. sbc.vale_fecha,
  5. sbc.fecha,
  6. sbc.movimiento,
  7. (select kms_sal-kms_ent kms from
  8. (select kms kms_sal from historico_neumaticos where vehiculo=sbc.vehiculo and cod_sal=2595)s,
  9. (select kms kms_ent from historico_neumaticos where vehiculo=sbc.vehiculo and cod_ent=2595)e) kms_recorridos
  10. h1.vale,
  11. h1.vehiculo,
  12. h1.kms,
  13. h1.vale_fecha,
  14. h1.fecha_ent fecha,
  15. 'Entrante' movimiento
  16. FROM historico_neumaticos h1
  17. WHERE h1.cod_ent=2595
  18. SELECT h2.vale,
  19. h2.vehiculo,
  20. h2.kms,
  21. h2.vale_fecha,
  22. h2.fecha_sal fecha,
  23. 'Saliente' movimiento
  24. FROM historico_neumaticos h2
  25. WHERE h2.cod_sal=2595) sbc
  26. ORDER BY sbc.vale,sbc.movimiento;

pero me sale que no conoce "sbc.vehiculo" imagino que porque esta en una subquery
__________________
C[^L*]D
[email protected]
tokkaido.blogspot.com
No hay mejor forma de aprender que enseñar

Última edición por tokkaido; 14/04/2010 a las 10:18
  #5 (permalink)  
Antiguo 15/04/2010, 01:19
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 8 meses
Puntos: 574
Respuesta: intercalar resultados de un union all

El problema es que la primera consulta te dara 2 registros por vehiculo y ahora quieres un campo que usa datos de los dos registros....

Eso lo puedes solucionar en la programación externa, en el momento de imprimir el listado haces el calculo.

La consulta que te adjunto tambien hace el calculo pero solo podras poner los campos que sean comunes, el vehiculo y no se si el vale....

Código MySQL:
Ver original
  1. SELECT sbc2.vehiculo,
  2.              sbc2.kmEnt,
  3.              sbc2.kmSal,
  4.              sbc2.kmSal-sbc2.kmEnt kmDif
  5. FROM (SELECT sbc.vehiculo,
  6.              sum(sbc.kms_ent) kmEnt,
  7.              sum(sbc.kms_sal) kmSal,
  8.            FROM (SELECT h1.vehiculo,
  9.                         h1.kms  kms_ent,
  10.                         0  kms_sal
  11.                       FROM historico_neumaticos h1
  12.                       WHERE h1.cod_ent=2595
  13.                       UNION all
  14.                       SELECT h2.vehiculo,
  15.                         0  kms_ent,
  16.                         h2.kms  kms_sal
  17.                       FROM historico_neumaticos h2
  18.                       WHERE h2.cod_sal=2595) sbc
  19.             GROUP BY sbc.vehiculo) sbc2;

Claro que si a esta le agregas los campos que faltan con una constante
...
"--" nombrecampo,
"Total" movimiento

y luego haces un union all con la del otro post tendras lo que buscas... pero es hacer muchas peticiones al servidor sobre la misma información.

Quim
  #6 (permalink)  
Antiguo 15/04/2010, 07:38
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 7 meses
Puntos: 300
Respuesta: intercalar resultados de un union all

creo que hemos equivocado el enfoque. Creo que nos estamos equivocando y para lo que quieres deberías usar un left join
SELECT hn1.vale,hn1.vehiculo,hn1.kms kmsaliente,hn1.vale_fecha,hn.1.fecha_ent fecha, hn1.movimiento, hn2.vale,hn2.vehiculo,hn2.kms kmentrante,hn2.vale_fecha,hn.2.fecha_ent fecha, hn2.movimiento, (hn2.kms-hn1.kms) kilometros FROM historico_neumaticos hn1 LEFT JOIN historico_neumaticos hn2 ON hn1.cod_sal = hn2.cod.sal WHERE cod_sal = 2595

Prueba y dinos. Si tienes coches no devueltos, no saldrán los kilómetros o saldrá un número negativo, aunque eso podría controlarse para que mostrarse "no ha sido devuelto", y lo mismo ocurriría con las fechas, aunque para las fechas puedes usar un IFNULL con la fecha de hoy para el caso de no haber fecha de devolución.
  #7 (permalink)  
Antiguo 15/04/2010, 10:16
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 8 meses
Puntos: 574
Respuesta: intercalar resultados de un union all

Pues tienes toda la razon Jurena!!!!

Quim
  #8 (permalink)  
Antiguo 15/04/2010, 15:43
 
Fecha de Ingreso: julio-2009
Mensajes: 90
Antigüedad: 15 años, 3 meses
Puntos: 4
Respuesta: intercalar resultados de un union all

Aprovechándome de la buena disposición quisiera plantear mi problemática con más detalle:

tengo una tabla llamada Historico_neumaticos que es donde guardo info de cuando un neumatico es instalado en un bus hasta que se retira, a estos procedimientos los llamo "movimiento" (entrante: cuando es instalado / saliente: cuando es retirado) ademas aquí se guarda el kilometraje que tenia el vehículo cuando se instaló o retiró el neumático y la profundidad del mismo en cada evento que son los datos mas importantes que necesito recolectar. Ademas como normalmente al momento de retirar un neumático debes por obligación color otro guardo todo en una misma fila más o menos de esta manera:

vale | fecha | vehiculo | kms_vehiculo | posicion | codigo_saliente | prof_saliente | codigo_entrante | prof_entrante

entonces digamos que un neumático tendrá tanto un movimiento entrante y uno saliente de ese vehículo y habrá acumulado una cantidad de kms y se habrá desgastado en una cantidad x de milímetros.

el mayor problema se me presenta en que algunos neumáticos ya están "instalados" en el bus por lo que solo voy a tener el movimiento de salida y al no haber un movimiento de entrada asumo que el kilometraje recorrido por el vehículo es el que el neumático tendrá acumulado.

No logro encontrar el método por el cual lograr en una o mas consultas obtener la historia de un neumático en particular.

¿Será una practica aconsejable registrar en el momento en que guardo el historico los kms recorridos en vez de tratar de calcularlos con un select?

Atento a sus comentarios.
__________________
C[^L*]D
[email protected]
tokkaido.blogspot.com
No hay mejor forma de aprender que enseñar
  #9 (permalink)  
Antiguo 15/04/2010, 16:09
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 7 meses
Puntos: 300
Respuesta: intercalar resultados de un union all

tokkaido, eso de
Cita:
el mayor problema se me presenta en que algunos neumáticos ya están "instalados" en el bus por lo que solo voy a tener el movimiento de salida y al no haber un movimiento de entrada asumo que el kilometraje recorrido por el vehículo es el que el neumático tendrá acumulado
, no me parece un problema grave, pues bastará con que cuando cargues el kms_vehiculo de entrante, lo cargues con un IFNULL(hn1.kms_vehiculo,0) kmsentrantes, y luego restas a los que llamarás kmssalientes esos kmsentrantes, y ya tendrás el kilometraje calculado.
Pero lo que ahora veo es algo más de la estructura de tu base y no me convence demasiado esa tabla.
Deberías mostrarnos la sintaxis de creación de tu tabla y algunos datos de inserción, además de decirnos exactamente lo que quieres sacar.

Última edición por jurena; 16/04/2010 a las 14:41

Etiquetas: resultados, union
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 07:56.