SQL - consulta sql

 
Vista:
Imágen de perfil de Jorge

consulta sql

Publicado por Jorge (4 intervenciones) el 13/11/2010 19:11:49
Hola ojala me puedan ayudar a realizar esta consulta ,

$query_llegadas = "select fecha_arribo, count(ref) as Llegadas from reservaciones where fecha_arribo >= '$fecha1' AND fecha_arribo <= '$fecha2' AND hidel != 1 group by fecha_arribo";

$query_salidas = "select fecha_partida, count(ref) as Salidas from reservaciones where fecha_partida >= '$fecha1' AND fecha_partida <= '$fecha2' and hidel != 1 AND ns<2 group by fecha_partida";

quisiera saber como realizar un union o join o crear una vista o algo para que al generar el query y el resultado sea una sola tabla o consulta

| fecha | Llegadas | Salidas
2010-11-01 2 4
2010-11-02 0 7
2010-11-03 5 1
2010-11-04 10 3
2010-11-05 6 0

Gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

RE:consulta sql

Publicado por Leonardo Josué (1173 intervenciones) el 18/11/2010 17:14:45
Buenos días Jorge,

No explicas en tu post qué problemas estás teniendo, ni qué manejador de bd estás utilizando. Tampoco me queda muy claras tus consultas, pero veamos a ver si más o menos esto es lo que necesitas. Según lo que entendí la primera de tus consultas te regresa algo como esto:

fecha_arribo|Llegadas
2010-11-01|2
2010-11-02|0
2010-11-03|5
2010-11-04|10
2010-11-05|6

y la segunda de las consultas que pusiste entonces te regresa algo como esto:

fecha_partida|Salidas
2010-11-01|4
2010-11-02|7
2010-11-03|1
2010-11-04|3
2010-11-05|0

Puedes intentar con esto

select T1.fecha_arribo as Fecha, T1.Llegadas, T2.Salidas from
(
select fecha_arribo, count(*) as Llegadas from reservaciones where fecha_arribo >= '$fecha1' AND fecha_arribo <= '$fecha2' AND hidel != 1 group by fecha_arribo
) T1
LEFT JOIN
(
select fecha_partida, count(*) as Salidas from reservaciones where fecha_partida >= '$fecha1' AND fecha_partida <= '$fecha2' and hidel != 1 AND ns<2 group by fecha_partida
) T2 on T1.fecha_arribo = T2.fecha_partida

Es posible que tengas que implementar un FULL JOIN, pero es cuestión que lo pruebes y nos comentes.

Saludos
Leo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Jorge

RE:consulta sql

Publicado por Jorge (4 intervenciones) el 18/11/2010 20:12:36
Hola Leo Gracias por la respuesta estoy iutilizand MYSQL 5.0 te explico bien.

esta es la tabla reservaciones que es donde necesito realizar la consulta:

Reservas

id | nombre | fecha_arribo | fecha salida |
1 jorge 2010-11-18 2010-11-25
1 Leo 2010-11-19 2010-11-19
1 juan 2010-11-18 2010-11-25

necesito consultar por dia cuantas llegadas y cuantas salidas hay para determinado dia o rango de fechas. todas las reservaciones estan en 1 tabla como puedes ver arriba por eso es que hago 2 consultas la primera para filtrar y contar las llegadas y la segunda para filtrar y contar las salidas. El problema esta cuando en alguna de las 2 consultas no hay registros osea que no hay llegadas ni salidas se descuadran los totales y los datos se suman mal ya que hago una suma en php.

while ($x <= $dias) {
$row= mysql_fetch_array($numresults_Llegadas);
$row2=mysql_fetch_array($numresults_salidas);
$fecha = $row["fecha_arribo"];
$Llegadas = $row["Llegadas"];
$Salidas = $row2["Salidas"];
$total=$Llegadas + $Salidas;
echo $total;
}

Saludos Leo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

RE:consulta sql

Publicado por Leonardo Josué (1173 intervenciones) el 18/11/2010 23:52:55
Hola de nuevo Jorge, antes que nada una observación, y es que este foro se trata sobre SQL, por lo que no es correcto que mezcles código de otros lenguajes, en este caso PHP, porque habemos algunos que no estamos familiarizados con la sintaxis de dicho lenguaje... lo correcto sería que publiques tu post en el foro correspondiente... ahora bien, sigo bien sin entender cual es el problema que tienes, pero voy a tratar de ayudarte. Si leiste la última parte de mi post anterior te comentaba que era posible utilizar un FULL JOIN para hacer la consulta, pero hasta donde recuerdo MySQL no permite este tipo de JOIN, sin embargo puedes simular este haciendo una UNION...

Supongamos que tienes una tabla con los siguientes datos:

id|fecha_arribo|fecha_partida
1|2010-10-30|2010-11-01
2|2010-10-30|2010-11-06
3|2010-11-01|2010-11-03
4|2010-11-01|2010-11-03
5|2010-11-02|2010-11-04
6|2010-11-03|2010-11-03
7|2010-11-03|2010-11-06
8|2010-11-05|2010-11-05
9|2010-11-05|2010-11-07
10|2010-11-06|2010-11-08

Si analizas un poco los datos observarás que el día 2010-11-04 no hay ningún arribo y el día 2010-11-02 no hay ninguna partida, Si quisieras obtener el total de llegadas y salidas para el periodo comprendido entre el 01 y 05 de Noviembre tendrías que hacer algo como esto:

select T1.fecha_arribo as fecha, T1.llegadas, ifnull(T2.salidas, 0) as salidas, T1.llegadas + ifnull(T2.salidas, 0) as Total from
(
select fecha_arribo, count(*) as llegadas from ejemplo_reservaciones where fecha_arribo >= '2010-11-01' and fecha_arribo <= '2010-11-05' group by fecha_arribo
) T1 LEFT JOIN
(
select fecha_partida, count(*) as salidas from ejemplo_reservaciones where fecha_partida >= '2010-11-01' and fecha_partida <= '2010-11-05' group by fecha_partida
) T2 on T2.fecha_partida = T1.fecha_arribo
union
select T1.fecha_partida as fecha, ifnull(T2.llegadas, 0), T1.salidas as salidas, ifnull(T2.llegadas, 0) + T1.salidas as Total from
(
select fecha_partida, count(*) as salidas from ejemplo_reservaciones where fecha_partida >= '2010-11-01' and fecha_partida <= '2010-11-05' group by fecha_partida
) T1 LEFT JOIN
(
select fecha_arribo, count(*) as llegadas from ejemplo_reservaciones where fecha_arribo >= '2010-11-01' and fecha_arribo <= '2010-11-05' group by fecha_arribo
) T2 on T2.fecha_arribo = T1.fecha_partida

esta consulta te regresaría lo siguiente:

fecha| llegadas| salidas| Total
---------- -------- ------- ------
2010-11-01| 2| 1| 3
2010-11-02| 1| 0| 1
2010-11-03| 2| 3| 5
2010-11-05| 2| 1| 3
2010-11-04| 0| 1| 1

Si esto no es lo que quieres de salida, pues trata de explicarte un poco mejor para tratar de ayudarte.

Saludos
Leo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Jorge

RE:consulta sql

Publicado por Jorge (4 intervenciones) el 19/11/2010 01:09:32
Hola Leo gracias por el tip, tengo una duda en el query que pones. si solo hay una tabla entendiendo T1 = reservaciones entonces de donde sacas T2.salidas? si no hay una segunda tabla? eso es lo que no encuentro como hacer, por que un join o union entre 2 tablas si entiendo como funciona pero de donde o como creas la T2 si no existe una tabla de reservaciones_2? no se si pueda contactarte x mail el mio es [email protected]

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Jorge

RE:consulta sql

Publicado por Jorge (4 intervenciones) el 19/11/2010 05:54:50
Hola Leo Excelente Trabajo !!!!!! Mil millones de felicidades !!!!! disculpa mis preguntas tan absurdas pero asi es la ignorancia... en fin la consulta funciona muy bien, pero tengo un detalle cuando no hay llegadas efectivamente la consulta pone 0 pero no siguen el consecutivo de los dias si no los manda al final de los registros.

este es el result set consultando 4 dias. Los resultados estan correctos pero no estan en orden. Si hay llegadas y salidas funciona muy bien.

fecha | llegadas | salidas | Total
2011-01-08, 7 , 14 , 21
2011-01-11, 2, 1, 3
2011-01-09, 0, 5, 5 " si pone el 0 pero se brinco al final "
2011-01-10, 0, 2, 2 " si pone el 0 pero se brinco al final"

Leo te agradezco tu ayuda haber si me puedes ayudar con este detalle.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

RE:consulta sql

Publicado por Leonardo Josué (1173 intervenciones) el 19/11/2010 16:31:22
Buenos días Jorge... Me alegra mucho que la consulta te haya servido, pero te explico de todas maneras para tratar de que no queden dudas. si analizas un poco la consulta podrás darte cuenta que efectivamente sólo estoy utilizando una tabla (RESERVACIONES) pero como estoy haciendo subconsultas es necesario aplicar alias a cada una de estas subconsultas que en este caso serían T1 y T2. Si analizas también mi primer Post te podrás dar cuenta que la consulta que te propongo ahí corresponde con la primer parte del UNION, la segunda parte es prácticamente la misma, lo único que cambia es el orden de las subconsultas (También se podría haber hecho con un RIGHT JOIN)

Puedes consultar a Santa Wikipedia acerca de cómo simular el FULL JOIN si es que el DBMS no lo tiene implementado

http://es.wikipedia.org/wiki/Join

Ahora bien, vamos a la parte de la ordenación. La consulta que puse no está ordenada por ningún campo por lo tanto presenta la información de acuerdo a como se insertó en la tabla. Si quieres ordenar los registros debes utilizar la clausula ORDER BY al final de la consulta. En este caso como quieres ordenar por fecha tendías que agregas un ORDER BY fecha y listo

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar