[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