[Php-avanzado] Consulta sobre Query
Leonardo Tadei - Pegasus Tech Supply
leonardot en pegasusnet.com.ar
Vie Mar 9 14:05:13 ART 2012
Hola Pablo!
El sáb, 03-03-2012 a las 23:47 -0300, pablo beroiza escribió:
>
>
> El 2 de marzo de 2012 13:23, Leonardo Tadei - Pegasus Tech Supply
> <leonardot en pegasusnet.com.ar> escribió:
> Hola Pablo,
>
> lo que estás necesitando tiene esta forma:
>
> SELECT *, (hora_salida - hora_entrada) AS sumahoras
> FROM `asistencias`
> GROUP BY id_alumno
>
> Hola Leo!!! con esta consulta solo consigo hacer la resta de la
> "hora_salida" menos "hora_entrada" agrupadas por "id_alumno" ya la
> estoy ocupando para sacar las horas que trabaja por dia "sumahoras".
> Lo que quiero es mostrar o proyectar "horas_por_dia"solo una vez
> cuando el alumno trabaja mas de una vez por día, para poder hacer el
> calculo del "saldo por dia" (es un calculo parcial). Si el alumno
> trabajo 2 veces en el dia no puedo tomarle en cuenta "horas_por_dia"
> dos veces, lo tengo que hacer solo una vez.
Es cierto que no podés tomarle "horas_por_dia", pero lo que sí podés
hacer es calcular la cantidad de horas de cada día y ponerle un
"total_diario" calculado, como se vería el saldo de una cuenta corriente
al lado de cada movimiento.
Otro enfoque que daría una proyección más parecida a la que querés, es
hacer una subconsulta por día para obtener las "horas_por_dia" de el día
en cuestión y luego los cálculos, con lo que "horas_por_dia" está solo
una vez en el cálculo de las horas trabajadas.
> Si hago una consulta general lo puedo hacer, pero lo que quiero es
> mostrarlo detallado por dia y ahi esta el problema.
>
>
> +-----------+----------+
> | id_alumno | sumahoras |
> +-----------+----------+
> | 1 | 7800 |
> | 2 | 1500 |
> +-----------+----------+
>
>
> select * from asistencias where id_alumno = $id_alumno
> Esto es lo que proyecto con la consulta
>
> +------------+---------------+--------------+-------------+
> | fecha | horas_por_dia | hora_entrada | hora_salida |
> +------------+---------------+--------------+-------------+
> | 15/02/2012 | 2:00 | 14:00 | 15:00 |
> | 16/02/2012 | 2:00 | 15:00 | 15:30 |
> | 17/02/2012 | 2:00 | 14:00 | 15:00 |
> | 17/02/2012 | 2:00 | 17:00 | 18:00 |
> | 18/02/2012 | 2:00 | 14:00 | 17:00 |
> +------------+---------------+--------------+-------------+
>
>
> Esto es lo que quiero proyectar con la consulta. Capaz con MySql no se
> puede y hay que hacerlo con php. Pero ese es el dilema no me sale con
> ninguno de los dos. Bueno espero poder hacerme entender. Desde ya
> Gracias!!!
>
> +------------+---------------+--------------+-------------+
> | fecha | horas_por_dia | hora_entrada | hora_salida |
> +------------+---------------+--------------+-------------+
> | 15/02/2012 | 2:00 | 14:00 | 15:00 |
> | 16/02/2012 | 2:00 | 15:00 | 15:30 |
> | 17/02/2012 | 2:00 | 14:00 | 15:00 |
> | 17/02/2012 | | 17:00 | 18:00 |
> | 18/02/2012 | 2:00 | 14:00 | 17:00 |
> +------------+---------------+--------------+-------------+
Así, de lejos, no sé si se puede (al menos no es nada trivial)
proyectar estas columnas y dejar algunas filas en blanco como en tu
ejemplo.
Sin embargo, si agrupás por día además de por alumno, y proyectás
sum(hora_entrada) - sum(hora_salida), lo que obtenés es "casi" el mismo
resultado:
+------------+---------------+--------------+-------------+----------+
| fecha | horas_por_dia | hora_entrada | hora_salida | subtotal |
+------------+---------------+--------------+-------------+----------+
| 15/02/2012 | 2:00 | 14:00 | 15:00 | 1:00 |
| 16/02/2012 | 2:00 | 15:00 | 15:30 | 0:30 |
| 17/02/2012 | 2:00 | 14:00 | 15:00 | 2:00 |
| 18/02/2012 | 2:00 | 14:00 | 17:00 | 3:00 |
+------------+---------------+--------------+-------------+----------+
y a su vez, la diferencia entre horas_por_dia y subtotal te dice si
cumplió o no cumplió el horario.
Si no es así, no es tan elegante por no estaría mal partir de la query:
select * from asistencias where id_alumno = $id_alumno
y en el while que recorre el resultado, hacer los cálculos y mostrar (o
no mostrar) lo que te haga falta.
PD: en tu planteo anterior, parecía que querías emitir el listado de
todos los alumnos de un taller, y no los de uno solo como en este caso.
Si lo emitís para un solo alumno es mucho más fácil porque tenés un
agrupamiento menos...
--
Leonardo Tadei
leonardot en pegasusnet.com.ar
Blog: http://blog.pegasusnet.com.ar
Firma pública: http://www.pegasusnet.com.ar/LeonardoTadei-public.key
Más información sobre la lista de distribución Php-avanzado