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

[SOLUCIONADO] Consulta agrupada de eventos de tabla

Estas en el tema de Consulta agrupada de eventos de tabla en el foro de SQL Server en Foros del Web. Hola: Tengo una pequeña pregunta o gran duda según se mire. Imaginar que tenemos una tabla de entradas y salidas de personas de un centro ...
  #1 (permalink)  
Antiguo 23/10/2013, 02:00
 
Fecha de Ingreso: octubre-2013
Mensajes: 3
Antigüedad: 11 años
Puntos: 0
Consulta agrupada de eventos de tabla

Hola:

Tengo una pequeña pregunta o gran duda según se mire. Imaginar que tenemos
una tabla de entradas y salidas de personas de un centro de trabajo o coches de
un garaje (mi caso real es otro pero la simplificación es suficiente). Imaginar que
la tabla se denomina TablaAccesos cuya estructura y datos es tal que así:

Código:
Nombre	Evento	Hora
------	------	-----
Pepe	0	9:35
Pepe	1	17:21
Juan	0	8:32
Juan	1	16:56
Tomas	0	10:00
donde el indicador Evento es igual a 0 cuando la persona entra, mientras que
Evento es igual a 1 cuando la persona abandona el edificio. Por simplicidad,
imaginar que para cada nombre sólo hay un evento de entrada y quizás uno (y
sólo uno) de salida.

Me gustaría realizar una única consulta SQL en el que se refleje cuando ha
entrado y cuando ha salido cada persona del edificio. Si no ha salido del
edificio (es decir, no hay evento de salida) quiero que el campo esté vacío, es
decir, el resultado de la consulta debería ser:

Código:
Nombre	Entrada	Salida
------	-------	------
Pepe	9:35	17:21
Juan	8:32	16:56
Tomas	10:00
He intentado construir la consulta de mil formas usando INNER JOIN, RIGHT JOIN,
LEFT JOIN, por ejemplo,

Código:
SELECT
	TblEntradas.Nombre AS Nombre,
	TblEntradas.Hora AS Entrada,
	TblSalidas.Hora AS Salida
FROM
	TablaAccesos AS TblEntradas
RIGHT JOIN
	TablaAccesos AS TblSalidas
ON
	TblEntradas.Nombre=TblSalidas.Nombre
WHERE
	TblEntradas.Evento=0 AND TblSalidas.Evento=1
y el resultado siempre es el mismo: no incluye el elemento que no tiene evento
de salida, es decir:

Código:
Nombre	Entrada	Salida
------	-------	------
Pepe	9:35	17:21
Juan	8:32	16:56
¿Alguien se le ocurre como se podría hacer la consulta para que incluya TODOS
los nombres?

Un saludo y gracias por adelantado
  #2 (permalink)  
Antiguo 23/10/2013, 02:39
 
Fecha de Ingreso: julio-2012
Ubicación: Israel
Mensajes: 360
Antigüedad: 12 años, 4 meses
Puntos: 40
Respuesta: Consulta agrupada de eventos de tabla

Haz la consulta con Left Join,
y pon todas las condiciones en la On (en lugar de la Where).

Cuando se trata de Inner Join no hay ninguna diferencia entre el On y el Where,
pero en caso de Left el resultado es diferente: cuando es en el Where - la condición elimina todos los resultados que no coinciden con en el lado del Left.
__________________
El Castellano no es mi lengua materna: discúlpenme por los errores gramaticales.
Mi blog
  #3 (permalink)  
Antiguo 23/10/2013, 02:52
 
Fecha de Ingreso: octubre-2013
Mensajes: 3
Antigüedad: 11 años
Puntos: 0
Respuesta: Consulta agrupada de eventos de tabla

Me autocontesto, por si alguien tiene el mismo problema:

Código:
TRANSFORM First(TablaAccesos.Hora) AS PrimeroDeHora
SELECT TablaAccesos.Nombre
FROM TablaAccesos
GROUP BY TablaAccesos.Nombre
PIVOT TablaAccesos.Evento
  #4 (permalink)  
Antiguo 23/10/2013, 03:05
 
Fecha de Ingreso: octubre-2013
Mensajes: 3
Antigüedad: 11 años
Puntos: 0
Respuesta: Consulta agrupada de eventos de tabla

Cita:
Iniciado por GeriReshef Ver Mensaje
Haz la consulta con Left Join,
y pon todas las condiciones en la On (en lugar de la Where).

Cuando se trata de Inner Join no hay ninguna diferencia entre el On y el Where,
pero en caso de Left el resultado es diferente: cuando es en el Where - la condición elimina todos los resultados que no coinciden con en el lado del Left.
Gracias GeriReshef:

No entendí muy bien tu solución así que he probado a modificar la consulta como propones y, teniendo en cuenta que las condiciones del WHERE no se podian poner tal cual en el ON (hay que relacionar dos campos de cada una de las tablas), la consulta quedaría tal que así:

Código:
SELECT TblEntradas.Nombre AS Nombre,TblEntradas.Hora AS Entrada,TblSalidas.Hora AS Salida
FROM TablaAccesos AS TblEntradas
LEFT JOIN TablaAccesos AS TblSalidas
ON TblEntradas.Nombre=TblSalidas.Nombre AND TblEntradas.Evento<>TblSalidas.Evento
WHERE TblEntradas.Evento=0
y efectivamente el resultado es el esperado

Código:
Nombre	Entrada	Salida
Pepe	9:35	17:21
Juan	8:32	16:56
Tomas	10:00
Así que aquí tenéis una segunda solución. Gracias de nuevo GeriReshef

Etiquetas: eventos, inner-join
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 08:19.