MySQL - Resultado de columna segun otra columna

 
Vista:
sin imagen de perfil

Resultado de columna segun otra columna

Publicado por roberto carrillo (4 intervenciones) el 16/01/2018 19:48:25
Hola quisiera hacer una consulta que me traiga, según la siguiente tabla:
-----------------------------------------------------------------------------------
LEGAJO | ENTRADASALIDA | FECHAHORA
-----------------------------------------------------------------------------------
111 | ENTRADA | 2017/01/01 08:01:00
111 | SALIDA | 2017/01/01 16:00:00
112 | ENTRADA | 2017/01/02 08:00:00
112 | SALIDA | 2017/01/03 16:02:00

el siguiente resultado para mostrar en un DataGridView:

LEGAJO:111
-----------------------------------------------------------------
FECHA | ENTRADA | SALIDA
-----------------------------------------------------------------
2017/01/01 | 08:01:00 | 16:00:00
2017/01/02 | 08:00:00 | 16:02:00


Trato de hacerlo de la siguiente manera pero no logro como hacerlo correctamente:

SELECT SUBSTRING( FECHAHORA, 1, 11) AS FECHA,
CASE ENTRADASALIDA WHEN ENTRADASALIDA =1 THEN SUBSTRING( FECHAHORA, 12, 8 ) END AS SALIDA,
CASE ENTRADASALIDA WHEN ENTRADASALIDA =0 THEN SUBSTRING( FECHAHORA, 12, 8 ) END AS ENTRADA
FROM presentismo
WHERE Legajo =111 ORDER BY FECHAHORA DESC
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: 953
Oro
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

Resultado de columna segun otra columna

Publicado por Leonardo Josué (414 intervenciones) el 16/01/2018 20:18:48
Hola Roberto:

Hay muchas formas de obtener el resultado que quieres, pero me quedan algunas dudas con respecto a tus datos:

1. En tu resultado esperado, dices que te interesan los registros del legado = 111, sin embargo el resultado que esperas es este:

1
2
3
4
5
6
LEGAJO:111
-----------------------------------------------------------------
FECHA | ENTRADA | SALIDA
-----------------------------------------------------------------
2017/01/01 | 08:01:00 | 16:00:00
2017/01/02 | 08:00:00 | 16:02:00

Siendo que el segundo registro corresponde al legajo 112. ¿Esto fue un error de posteo o cómo es que obtienes estos datos?

2. En tu tabla, ¿cada legajo tiene una y sólo una entrada y una sola salida? si fuera el caso de que tengan más de una entrada y/o salida, cómo debería ser entonces el resultado que esperas.

3. La entrada y salida para un Legajo, ¿corresponden siempre al mismo día? o pudiera darse el caso de que una entrada sea en un día y la salida en otro día distinto.

Dependiendo de lo que respondas a estas preguntas, la consulta que voy a poner te puede servir o no. Esto sería utilizando subconsultas:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mysql> SELECT
    ->   T1.legajo,
    ->   (SELECT DATE(T2.fechahora) FROM tabla T2 WHERE T1.legajo = T2.legajo AND T2.entradasalida = 'ENTRADA') fecha,
    ->   (SELECT TIME(T2.fechahora) FROM tabla T2 WHERE T1.legajo = T2.legajo AND T2.entradasalida = 'ENTRADA') entrada,
    ->   (SELECT TIME(T2.fechahora) FROM tabla T2 WHERE T1.legajo = T2.legajo AND T2.entradasalida = 'SALIDA') salida
    -> FROM tabla T1
    -> WHERE T1.legajo = 111
    -> GROUP BY T1.legajo;
+--------+------------+----------+----------+
| legajo | fecha      | entrada  | salida   |
+--------+------------+----------+----------+
|    111 | 2017-01-01 | 08:01:00 | 16:00:00 |
+--------+------------+----------+----------+
1 rows in set (0.01 sec)

Esta solución no es la única ni la mejor, pero igual y te puede servir.

Dale un vistazo y nos comentas.

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

Resultado de columna segun otra columna

Publicado por roberto carrillo (4 intervenciones) el 16/01/2018 20:45:23
Hola Leo, desde ya muchas gracias por responder.
Y si, me equivoqué cuando puse como ejemplo las filas que debería traer la consulta.
Y respondiendo a la pregunta te contesto que en la misma tabla llegan varios fechas con varias entradas y salidas en diferentes horarios, por ejemplo:
-----------------------------------------------------------------------------------
LEGAJO | ENTRADASALIDA | FECHAHORA
-----------------------------------------------------------------------------------
111 | ENTRADA | 2017/01/01 08:01:00
111 | SALIDA | 2017/01/01 16:00:00
112 | ENTRADA | 2017/01/01 08:00:00
112 | SALIDA | 2017/01/01 16:02:00
111 | ENTRADA | 2017/01/02 08:01:00
111 | SALIDA | 2017/01/02 16:04:00
112 | ENTRADA | 2017/02/01 08:11:00
112 | SALIDA | 2017/01/02 15:30:00
113 | ENTRADA | 2017/01/02 08:01:00
113 | SALIDA | 2017/01/02 16:00:00
111 | SALIDA | 2017/01/02 20:00:00 --------ERROR AL MARCAR
111 | ENTRADA | 2017/01/02 20:01:00
111 | SALIDA | 2017/01/02 23:45:00

Creo en este ejemplo no equivocarme y ser mas claro.

En el ejemplo que me das para probar me sale la leyenda: #1242 - Subquery returns more than 1 row
Muchas gracias!!
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: 953
Oro
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

Resultado de columna segun otra columna

Publicado por Leonardo Josué (414 intervenciones) el 16/01/2018 23:54:59
Hola de Nuevo Roberto:

Tal como te comenté, la consulta que ponía sólo servía en el caso de sólo hubiera una entrada o una salida para cada legajo...

En el caso que planteas, donde se tienen más de una salida, entonces, ¿qué es lo que quieres hacer? ¿se debe tomar sólo uno de los registros? si es así, entonces ¿cuál de los registros es el que debes considerar para mostrarse?

Podrías jugar con la misma opción de las subconsultas y utilizar por ejemplo las funciones de agrupación MIN y MAX para extraer sólo un registro, (por ejemplo la mínima hora como la primer entrada y la máxima salida como la última entrada), es decir, algo así:

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
mysql> SELECT
    ->   T1.legajo,
    ->   DATE(T1.fechahora) fecha,
    ->   ( SELECT MIN(TIME(T2.fechahora))
    ->     FROM tabla T2
    ->     WHERE T1.legajo = T2.legajo AND
    ->           DATE(T1.fechahora) = DATE(T2.fechahora) AND
    ->           T2.entradasalida = 'ENTRADA') entrada,
    ->   ( SELECT MAX(TIME(T2.fechahora))
    ->     FROM tabla T2
    ->     WHERE T1.legajo = T2.legajo AND
    ->           DATE(T1.fechahora) = DATE(T2.fechahora) AND
    ->           T2.entradasalida = 'SALIDA') salida
    -> FROM tabla T1
    -> GROUP BY legajo, DATE(T1.fechahora);
+--------+------------+----------+----------+
| legajo | fecha      | entrada  | salida   |
+--------+------------+----------+----------+
|    111 | 2017-01-01 | 08:01:00 | 16:00:00 |
|    111 | 2017-01-02 | 08:01:00 | 23:45:00 |
|    112 | 2017-01-01 | 08:00:00 | 16:02:00 |
|    112 | 2017-01-02 | NULL     | 15:30:00 |
|    112 | 2017-02-01 | 08:11:00 | NULL     |
|    113 | 2017-01-02 | 08:01:00 | 16:00:00 |
+--------+------------+----------+----------+
6 rows in set (0.00 sec)

Sin embargo, observa que hay registros que aparecen con NULL, esto es porque para el legajo y la fecha específicado no hay entrada o no hay salida.

Ahí tienes qué definir el tratamiento que se le tiene que dar.

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
1
Comentar
sin imagen de perfil

Resultado de columna segun otra columna

Publicado por roberto (4 intervenciones) el 17/01/2018 13:16:50
Agradecidísimo por tu materia gris y buena voluntad, es increíble para mi, sabiendo de antemano que existen estas herramientas (DATE, MIN,MAX,GROUP, etc), el ver como construis la consulta sin equivocarte para asistir a lo que busco exactamente (Pasé horas tratando de armar algo en mi cabeza sin llegar a un buen resultado).
Así que...... Muchísimas gracias y espero poder, en algún momento, tener la virtud y capacidad de poder ver las cosas tan claras como las ves vos.
Saludos.

mysql> SELECT
-> T1.legajo,
-> DATE(T1.fechahora) fecha,
-> ( SELECT MIN(TIME(T2.fechahora))
-> FROM tabla T2
-> WHERE T1.legajo = T2.legajo AND
-> DATE(T1.fechahora) = DATE(T2.fechahora) AND
-> T2.entradasalida = 'ENTRADA') entrada,
-> ( SELECT MAX(TIME(T2.fechahora))
-> FROM tabla T2
-> WHERE T1.legajo = T2.legajo AND
-> DATE(T1.fechahora) = DATE(T2.fechahora) AND
-> T2.entradasalida = 'SALIDA') salida
-> FROM tabla T1

WHERE legajo=111

-> GROUP BY legajo, DATE(T1.fechahora)

ORDER BY DATE(fechahora) DESC
;
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