none
Consulta left join a una misma tabla RRS feed

  • Pregunta

  • Hola, tengo una tabla llamada reservas, donde se registrar las entradas y salidas de personas de un hotel.

    Cuando llega una persona al hotel se crea un registro con el id de la persona,fecha, y un codigo de evento(1 es llegada,2 es salida), al irse es lo mismo solo cambia el codigo de evento.

    ademas tengo una tabla clientes ,relacionada con el id a la tabla reservas.

    Como puedo hacer para obtener los datos de las personas, su fecha de llegada y de salida?

    pensaba hacerlo con un left join sobre la misma tabla revervas, pero no se si se pueda.

    uso sql 2000.

    gracias

    miércoles, 20 de julio de 2016 19:01

Respuestas

  • daniel_316.-,

    ¿Por qué insertas dos filas por un servicio de hospedaje? ¿No basta con tener dos columnas: [FechaIngreso] y [FechaSalida]?, consideralo. 

    Sobre lo que tienes, puedes realizar lo siguiente:

    SELECT
    	c.NombreCliente,
    	MAX(CASE WHEN (r.CodigoEvento = 1) THEN Fecha END) [FechaIngreso],
    	MAX(CASE WHEN (r.CodigoEvento = 2) THEN Fecha END) [FechaSalida]
    FROM
    	Reservas r
    	INNER JOIN Clientes c ON (c.idCliente = r.idCliente)
    GROUP BY
    	c.idCliente,
    	c.NombreCliente;


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta daniel_316.- miércoles, 20 de julio de 2016 19:38
    miércoles, 20 de julio de 2016 19:15

Todas las respuestas

  • Hola.

    Si entendí bien, solo guardas una fecha, sospecharía que la de entrada y actualizas con un 1 en el campo Código de Evento, ya que precisamente está llegando. Y cuando la persona sale, actualizas con un 2 en el campo Código de Evento, ¿correcto?

    Sugiero modificar el esquema de la tabla para que tengas dos campos Fecha_Entrada y Fecha_Salida y así evitas duplicar el registro. Si la persona no ha salido aún, el campo Fecha_Salida lo mantienes en NULL.

    Saludos,


    Guillermo Taylor F.
    MVP SQL Server & IT Pro
    Mi Blog

    miércoles, 20 de julio de 2016 19:15
  • daniel_316.-,

    ¿Por qué insertas dos filas por un servicio de hospedaje? ¿No basta con tener dos columnas: [FechaIngreso] y [FechaSalida]?, consideralo. 

    Sobre lo que tienes, puedes realizar lo siguiente:

    SELECT
    	c.NombreCliente,
    	MAX(CASE WHEN (r.CodigoEvento = 1) THEN Fecha END) [FechaIngreso],
    	MAX(CASE WHEN (r.CodigoEvento = 2) THEN Fecha END) [FechaSalida]
    FROM
    	Reservas r
    	INNER JOIN Clientes c ON (c.idCliente = r.idCliente)
    GROUP BY
    	c.idCliente,
    	c.NombreCliente;


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta daniel_316.- miércoles, 20 de julio de 2016 19:38
    miércoles, 20 de julio de 2016 19:15
  • Willams, viendo el codigo que posteas entiendo que se asume que solo te retornaria la ultima entrada y salida (que deberian formar parte del mismo servicio) de un cliente, pero si el cliente es frecuente en este hotel y se requiere el historial? Seria bueno que lo aclare el usuario que posteo la consulta.

    "Oh, the wind, the wind is blowing,through the graves the wind is blowing,Freedom soon will come; then well come from the shadows".The Partisan(Leonard Cohen) Email: me[at]geohernandez.net Blog:www.geohernandez.net

    miércoles, 20 de julio de 2016 19:24
  • daniel_316.-,

    Considera las observaciones respecto a evitar tener dos registros por servicio y en caso mantengas la estructura válida lo que menciona Geovanny, efectivamente la agrupación por cliente "oculta" las sucesivas visitas, para ello quizá sirva agrupar por un código de reserva, pero aún así, nota que redundas en valores al tener dos filas iguales donde la única columna distinta es CodigoEvento.

    miércoles, 20 de julio de 2016 19:50