SQL - AYUDA CON SENTENCIA SQL

   
Vista:

AYUDA CON SENTENCIA SQL

Publicado por Mario Herrera (2 intervenciones) el 14/12/2011 01:22:41
NECESITO AYUDA CON UNA SENTENCIA SQL DE UNA TABLA DE ASISTENCIA DE PERSONAL A OTRA QUE NO SE COMO HACERLO...
LA TABLA ORIGINAL ES:


Userid Usuario CheckTime CheckType
3007 Mario Herrera 27/06/2011 07:30 I
3006 Veronica López 27/06/2011 07:32 I
5008 Xavier Ortiz 27/06/2011 07:37 I
5032 Jose Burgos 27/06/2011 07:51 I
5032 Jose Burgos 27/06/2011 16:27 O
5008 Xavier Ortiz 27/06/2011 18:29 O
3007 Mario Herrera 27/06/2011 18:40 O
3006 Veronica López 27/06/2011 18:47 O

Y LA CONSULTA SQL QUE QUIERO CREAR DEBERIA ARROJAR LO SIGUIENTE:


Userid Usuario ENTRADA SALIDA
3007 Mario Herrera 27/06/2011 07:30 27/06/2011 18:40
3006 Veronica López 27/06/2011 07:32 27/06/2011 18:47
5008 Xavier Ortiz 27/06/2011 07:37 27/06/2011 18:29
5032 Jose Burgos 27/06/2011 07:51 27/06/2011 16:27

NO SE COMO HACERLO AYUDA PORFAVOR
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

AYUDA CON SENTENCIA SQL

Publicado por leonardo_josue (877 intervenciones) el 14/12/2011 16:26:47
Hola Mario Herrera...

Este tema es recurrente en los foros, seguramente estás llevando una especie de control de asistencia, Sin embargo la consulta suele ser diferente en cada caso pues hay que tener muchas consideraciones, por ejemplo.

1. ¿Una persona puede entrar y salir varias veces un mismo día? esto suele suceder en muchos lugares, por lo tanto cómo vas a tomas estos casos, ¿tomando sólo la mínima hora de entrada y la máxima hora de salida...?
2. ¿Una persona siempre debe tener una hora de entrada y una hora de salida por día? que pasa por ejemplo con las personas que trabajan turnos nocturnos... ellos pueden checar a las 11 de la noche de un día y salir a las 6 de la mañana del día siguiente, en tu caso se puede dar este escenario?
3. ¿Qué BD estás utilizando? aunque la mayoría de los Motores tienen sintaxis semejante, el manejo de fechas y horas suele ser muy diferente entre uno y otro.

Te pongo una consulta en MySQL que pudiera servirte, está considerando que una persona puede tener varias entradas y salidas y que es posible que no se tengan horas de salida, pero si de entrada...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
mysql> SELECT * FROM tabla_original;
+--------+----------------+---------------------+-----------+
| Userid | Usuario        | CheckTime           | CheckType |
+--------+----------------+---------------------+-----------+
|   3007 | Mario Herrera  | 2011-06-27 07:30:00 | I         |
|   3006 | Veronica López | 2011-06-27 07:32:00 | I         |
|   5008 | Xavier Ortiz   | 2011-06-27 07:37:00 | I         |
|   5032 | Jose Burgos    | 2011-06-27 07:51:00 | I         |
|   5032 | Jose Burgos    | 2011-06-27 16:27:00 | O         |
|   5032 | Jose Burgos    | 2011-06-27 16:28:00 | I         |
|   5032 | Jose Burgos    | 2011-06-27 17:02:00 | O         |
|   5032 | Jose Burgos    | 2011-06-27 17:07:00 | I         |
|   5032 | Jose Burgos    | 2011-06-27 18:00:00 | O         |
|   5008 | Xavier Ortiz   | 2011-06-27 18:29:00 | O         |
|   3007 | Mario Herrera  | 2011-06-27 18:40:00 | O         |
|   3006 | Veronica López | 2011-06-27 18:47:00 | O         |
|   5032 | Jose Burgos    | 2011-06-28 07:00:00 | I         |
+--------+----------------+---------------------+-----------+
13 rows in set (0.01 sec)
 
mysql> SELECT T1.userid, T1.usuario, T1.dia,
    -> TIME(t1.entrada) entrada, TIME(T2.salida) salida
    -> FROM
    -> (SELECT userid, usuario, DATE(checktime) dia, MIN(checkTime) entrada
    -> FROM tabla_original WHERE checktype = 'I'
    -> GROUP BY userid, usuario, DATE(checktime)) T1
    -> LEFT JOIN
    -> (SELECT userid, usuario, DATE(checktime) dia, MAX(checkTime) salida
    -> FROM tabla_original WHERE checktype = 'O'
    -> GROUP BY userid, usuario, DATE(checktime)) T2 ON
    -> T1.userid = T2.userid AND
    -> T1.usuario = T2.usuario AND
    -> T1.dia = T2.dia;
+--------+----------------+------------+----------+----------+
| userid | usuario        | dia        | entrada  | salida   |
+--------+----------------+------------+----------+----------+
|   3006 | Veronica López | 2011-06-27 | 07:32:00 | 18:47:00 |
|   3007 | Mario Herrera  | 2011-06-27 | 07:30:00 | 18:40:00 |
|   5008 | Xavier Ortiz   | 2011-06-27 | 07:37:00 | 18:29:00 |
|   5032 | Jose Burgos    | 2011-06-27 | 07:51:00 | 18:00:00 |
|   5032 | Jose Burgos    | 2011-06-28 | 07:00:00 | NULL     |
+--------+----------------+------------+----------+----------+
5 rows in set (0.08 sec)


La consulta utiliza dos subconsultas, para tratar por separado las entradas y las salidas, al final las une con un LEFT JOIN... Dale un vistazo para ver si te sirve, y si tienes alguna duda lo comentas en el foro.

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

AYUDA CON SENTENCIA SQL

Publicado por Jose (1 intervención) el 11/09/2012 21:53:51
Hola a todos, Leonardo de verdad me ha servido de mucho tu consulta ya que me ha orientado bastante, queria consultarte que es lo que se debe hacer tomando en cuenta que no se tenga una hora de entrada pero si de salida, me explico en el caso que planteaste anteriormente cuando la persona no haya marcado su hora de salida en la tabla resultante se le coloca NULL. Yo quisiera que si no hubiese hora de entrada pero si de salida colocara la entrada en null.

Esto porque puede darse el caso de que la persona olvido al llegar marcar su entrada pero si marco su salida y viceversa.

Ademas de eso como podria calcular el total de horas trabajadas entre estas dos columnas?
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

AYUDA CON SENTENCIA SQL

Publicado por Mario Herrera (2 intervenciones) el 02/10/2012 22:33:30
Gracias Leonardo por tu aporte....Me funcionó perfectamente en Access.....Ahora tengo una consulta de referencia cruzada de múltiples valores que la verdad es bastante complicada.. por favor su ayuda en este tema........
userid | ----------usuario --------- | ------ 2011-06-27 ----------- || ------- 2011-06-28 ------- |

+--------+-----------------------+------------+--------------+-------------+-------------+------------+---------+

| 3006 | Veronica López | 07:32:00 | 18:47:00 | 11:15:00 ---||--- NULL | NULL | NULL |

| 3007 | Mario Herrera--- | 07:30:00 | 18:40:00 | 11:10:00 ---||--- NULL | NULL | NULL |

| 5008 | Xavier Ortiz ------| 07:37:00 | 18:29:00 | 10:52:00 ----||---NULL | NULL | NULL |

| 5032 | Jose Burgos----- | 07:51:00 | 18:00:00 | 10:09:00 ---||--- 07:00:00 | NULL | NULL |

+--------+-----------------------+-------------+-------------+-------------+--------------+-----------+----------+
------------------------------------Entrada-----Salida-----Horas Trab.
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

AYUDA CON SENTENCIA SQL

Publicado por Cristina Murguia (2 intervenciones) el 03/01/2013 17:06:34
Hola buenos dias tengo un problema parecido y me sirvio mucho la consulta que propone leonardo_josue, muchas gracias!!
pero no se si pudieras ayudarme ya que aparte de la entrada y la salida yo necesito mostrar en la consulta la salida a comer y la entrada de comer, lo cuel debo sacar de los 4 registros que obtengo por día por cada empleado.


te agradeceria mucho tus comentarios al respecto.

saludos y gracias de antemano.
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