Ok, lo que necesitamos es ver el movimiento de entrada y salida para cada día de la semana. Sencillo:
Vamos a generar los dominios para cada tipo de evento y para cada día de la semana considerando que en una fecha existen dos movimientos (si existieran más, se tienen que hacer consideraciones adicionales),
así que tomaremos como referencia la fecha
Código SQL
[-]
//Para las entradas
Select Hor_Tipo As E, Per_Nr As FichaE,
CONVERT(Char(10), Hor_Fecha, 103) AS FechaE,
CONVERT(Char(8), Hor_Fecha, 108) AS HoraE
From Horario
Where HorTipo = 1
// Para las salidas
Select Hor_Tipo As S, Per_Nr As FichaS,
CONVERT(Char(10), Hor_Fecha, 103) AS FechaS
CONVERT(Char(8), Hor_Fecha, 108) AS HoraS
From Horario
Where HorTipo = 0
Ahora obtenemos el producto de las tablas
Código SQL
[-]
Select Entrada.E, Entrada.FichaE, Entrada.FechaE, Entrada.HoraE,
Salida.S, Saalida.FichaS, Entrada.FechaS, Entrada.HoraS
From (
Select Hor_Tipo As E, Per_Nr As FichaE,
CONVERT(Char(10), Hor_Fecha, 103) AS FechaE,
CONVERT(Char(8), Hor_Fecha, 108) AS HoraE
From Horario
Where HorTipo = 1
) As Entrada
Left Join (
Select Hor_Tipo As S, Per_Nr As FichaS,
CONVERT(Char(10), Hor_Fecha, 103) AS FechaS
CONVERT(Char(8), Hor_Fecha, 108) AS HoraS
From Horario
Where HorTipo = 0
) As Salida
On Entrada.FechaE = Salida.FechaS And
Entrada.FichaE = Salida.FichaS
Te preguntarás por que left y no inner bueno, sencillamente por que así detectaras
a quienes registraron su entrada pero no la salida.
Suerte