Te estas complicando muchisimo, te comento entre-lineas
El 9 de febrero de 2018, 11:30, Brunhilde Sibeth <bruma13sib...@gmail.com> escribió: > Buenas a todos nuevamente, > > Me fue genial la ayuda que me brindaron y quiero abusar con otra > consulta, ya que volví a estancarme en otro punto que creo es más de > lógica, aunque puede que postgres tenga una función que pueda facilitarme > la tarea, o tal vez lo extensa de mi consulta es lo que me tiene mareada. > > Con el aporte armé una consulta que actualizará con valores una > tabla. La consulta está de modo prueba, para ir viendo si cumple con lo que > necesito. > > Esto es el resultado de la consulta, donde solo me voy a centrar a modo de > ejemplo en una semana (del rango de un mes), obtengo: > > Fecha Hs_total Hs_total_2 HORA HORA_CALCULADA > 2018-01-15 11:41:00 00:00:00 03:41:00 00:00:00 > 2018-01-16 12:07:00 00:00:00 04:07:00 00:00:00 > 2018-01-17 12:09:00 00:00:00 04:09:00 00:00:00 > 2018-01-18 08:52:00 - 00:52:00 00:52:00 > 2018-01-19 08:23:00 00:00:00 00:23:00 00:23:00 > > Necesitaba identificar el numero de semana para hacer una sumatoria de la > columna HORA la cual por semana no debe pasar el total de 08:00:00 hs para > que la la columna HORA _CALCULADA no supere en sumatoria el total de 8 hs > semanal. Obviamente en HORA se mantiene los valores originales para no > perder esa información. > > Con la consulta lo que quiero lograr es lo siguiente como por dia puede > alcarzar en HORA_CALCULADA hasta 03:00:00 y en la semana 08:00:00; lo > siguiente es lo que necesito obtenrer; > La suma por dia es maximo 3 horas y por semana 8 horas. si pones "hasta 3:00:00" primero entendi que "hasta 3 a.m." > > Fecha Hs_total Hs_total_2 HORA HORA_CALCULADA > 2018-01-15 11:41:00 00:00:00 03:41:00 03:00:00 > 2018-01-16 12:07:00 00:00:00 04:07:00 03:00:00 > 2018-01-17 12:09:00 00:00:00 04:09:00 02:00:00 > 2018-01-18 08:52:00 - 00:52:00 00:00:00 > 2018-01-19 08:23:00 00:00:00 00:23:00 00:00:00 > > Mi consulta super extensa (inconscientemente siempre voy por el camino más > largo): > > > SELECT registros.fecha, registros.hs_total,registros. > hs_total_2,registros.HORA, > Aqui selecionas los campos tal cual como estan de tu tabla > CASE WHEN registros.hs_total::interval IS NULL AND > (registros.hs_total_2::interval > > '08:49:00'::interval) THEN > ¿cuándo hs_total tiene valor y cuando no? ¿cuándo hs_total_2 tiene valor y cuando no? > CASE WHEN (registros.hs_total_2::interval-'08:00:00'::interval) > >='03:00:00' > AND EXTRACT (WEEK FROM registros.fecha)=1 THEN > > CASE WHEN ( (SELECT SUM(HORA) > FROM control_asistencia.presentismo_aux > WHERE personal_id= registros.personal_id > AND fecha NOT IN (registros.fecha) > AND EXTRACT (week from fecha)IN (1)) >='08:00:00' )THEN > > '00:00:00'::interval -- NO COLOCA LAS HORAS EXTRAS > > 1.- Aqui revisas que si hs_total_2 menos 8a.m. es mayor o igual de 3a.m. y estas en la semana 1 2.- De la tabla presentismo_aux, sumas las horas el mismo personal_id y que no sean del miso día, y si suman mas de 8 no las muestras. 3.- Aqui tienes un problema, EXTRACT (week from fecha) puede regresar valores de 1 a 53. Osea tendrias que agregar mas CASE. 4.- ¿Porqué no buscas en la misma fecha? ¿Qué tiene la tabla presentismo_aux? > WHEN ( (SELECT SUM(HORA) > FROM control_asistencia.presentismo_aux > WHERE personal_id= registros.personal_id > AND fecha NOT IN (registros.fecha) > AND EXTRACT (week from fecha) IN (1))<='07:59:00') THEN > > registros.hs_total_2::interval-'08:00:00'::interval --COLOCA LAS > HORAS > > ELSE > > registros.hs_total_2::interval-'08:00:00'::interval > > END > > WHEN ((registros.hs_total_2::interval-'08:00:00'::interval) > >='03:00:00' > AND EXTRACT (WEEK FROM registros.fecha)=2 )THEN > > CASE WHEN ( (SELECT SUM(HORA) > FROM control_asistencia.presentismo_aux > WHERE personal_id= registros.personal_id > AND fecha NOT IN (registros.fecha) > AND EXTRACT (week from fecha) IN (2))>'08:00:00') THEN > > '00:00:00'::interval -- NO COLOCA LAS HORAS > > WHEN ( (SELECT SUM(HORA) > FROM control_asistencia.presentismo_aux > WHERE personal_id= registros.personal_id > AND fecha NOT IN (registros.fecha) > AND EXTRACT (week from fecha) IN (2))<='07:59:00') THEN > > registros.hs_total_2::interval-'08:00:00'::interval --COLOCA LAS > HORAS > > ELSE > > registros.hs_total_2::interval-'08:00:00'::interval > > END > > WHEN (registros.hs_total_2::interval-'08:00:00'::interval)>'03:00:00' > AND EXTRACT (WEEK FROM registros.fecha)=3 THEN > > CASE WHEN ( SELECT SUM(HORA) > FROM control_asistencia.presentismo_aux > WHERE personal_id= registros.personal_id > AND fecha NOT IN (registros.fecha) > AND EXTRACT (week from fecha) IN (3))>='08:00:00' THEN > > '00:00:00'::interval -- NO COLOCA LAS HORAS EXTRAS > > WHEN ( (SELECT SUM(HORA) > FROM control_asistencia.presentismo_aux > WHERE personal_id= registros.personal_id > AND fecha NOT IN (registros.fecha) > AND EXTRACT (week from fecha) IN (3))<='07:59:00') THEN > > registros.hs_total_2::interval-'08:00:00'::interval --COLOCA LAS > HORAS > > ELSE > > registros.hs_total_2::interval-'08:00:00'::interval > > END > > > WHEN (registros.hs_total_2::interval > '08:49:00'::interval > AND (registros.hs_total_2::interval-'08:00:00'::interval) > >='03:00:00' > AND EXTRACT (WEEK FROM registros.fecha)=4 )THEN > > CASE WHEN ( (SELECT SUM(HORA) > FROM control_asistencia.presentismo_aux > WHERE personal_id= registros.personal_id > AND fecha NOT IN (registros.fecha) > AND EXTRACT (week from fecha) IN (4))>='08:00:00') THEN > > '00:00:00'::interval -- NO COLOCA LAS HORAS > > WHEN ( (SELECT SUM(HORA) > FROM control_asistencia.presentismo_aux > WHERE personal_id= registros.personal_id > AND fecha NOT IN (registros.fecha) > AND EXTRACT (week from fecha) IN (4))<='07:59:00') THEN > > registros.hs_total_2::interval-'08:00:00'::interval --COLOCA LAS > HORAS > > ELSE > > registros.hs_total_2::interval-'08:00:00'::interval > > END > > WHEN (registros.hs_total_2::interval > '08:49:00'::interval > AND (registros.hs_total_2::interval-'08:00:00'::interval) > >='03:00:00' > AND EXTRACT (WEEK FROM registros.fecha)=5 )THEN > > CASE WHEN ( (SELECT SUM(HORA) > FROM control_asistencia.presentismo_aux > WHERE personal_id= registros.personal_id > AND fecha NOT IN (registros.fecha) > AND EXTRACT (week from fecha) IN (5))>='08:00:00') THEN > > '00:00:00'::interval -- NO COLOCA LAS HORAS > > WHEN ( (SELECT SUM(HORA) > FROM control_asistencia.presentismo_aux > WHERE personal_id= registros.personal_id > AND fecha NOT IN (registros.fecha) > AND EXTRACT (week from fecha) IN (5))<='07:59:00') THEN > > registros.hs_total_2::interval-'08:00:00'::interval --COLOCA LAS > HORAS > > ELSE > > registros.hs_total_2::interval-'08:00:00'::interval > > END > > WHEN ( registros.hs_total_2::interval-'08:00:00'::interval )< > '00:00:00'::interval THEN > '00:00:00'::interval > ELSE > registros.hs_total_2::interval-'08:00:00'::interval > END > ELSE > CASE WHEN ( registros.hs_total::interval > '08:49:00'::interval > AND ( registros.hs_total::interval-'08:00:00'::interval)>='03:00:00' > AND EXTRACT (WEEK FROM registros.fecha)=1 )THEN > > CASE WHEN ( (SELECT SUM(HORA) > FROM control_asistencia.presentismo_aux > WHERE personal_id= registros.personal_id > AND fecha NOT IN (registros.fecha) > AND EXTRACT (week from fecha) IN (1))>='08:00:00') THEN > > '00:00:00'::interval -- NO COLOCA LAS HORAS > > WHEN ( (SELECT SUM(HORA) > FROM control_asistencia.presentismo_aux > WHERE personal_id= registros.personal_id > AND fecha NOT IN (registros.fecha) > AND EXTRACT (week from fecha) IN (1))<='07:59:00') THEN > > registros.hs_total::interval-'08:00:00'::interval --COLOCA LAS > HORAS > > ELSE > > registros.hs_total::interval-'08:00:00'::interval > > END > > WHEN (registros.hs_total::interval > '08:49:00'::interval > AND (registros.hs_total::interval-'08:00:00'::interval)>='03:00:00' > AND EXTRACT (WEEK FROM registros.fecha)=2 )THEN > > CASE WHEN ( (SELECT SUM(HORA) > FROM control_asistencia.presentismo_aux > WHERE personal_id= registros.personal_id > AND fecha NOT IN (registros.fecha) > AND EXTRACT (week from fecha) IN (2))>='08:00:00') THEN > > (SELECT SUM(HORA) > FROM control_asistencia.presentismo_aux > WHERE personal_id= registros.personal_id > AND fecha NOT IN (registros.fecha) > AND EXTRACT (week from fecha) IN (2)) - (SELECT HORA FROM > control_asistencia.presentismo_aux > WHERE personal_id= registros.personal_id > AND fecha= registros.fecha) > > WHEN ( (SELECT SUM(HORA) > FROM control_asistencia.presentismo_aux > WHERE personal_id= registros.personal_id > AND fecha NOT IN (registros.fecha) > AND EXTRACT (week from fecha) IN (2))<='07:59:00') THEN > > registros.hs_total::interval-'08:00:00'::interval --COLOCA LAS > HORAS > > ELSE > > registros.hs_total::interval-'08:00:00'::interval > > END > > WHEN ((registros.hs_total::interval-'08:00:00'::interval)>='03:00:00' > AND EXTRACT (WEEK FROM registros.fecha)=3 )THEN > > CASE WHEN ( (SELECT SUM(HORA) > FROM control_asistencia.presentismo_aux > WHERE personal_id= registros.personal_id > AND fecha NOT IN (registros.fecha) > AND EXTRACT (week from fecha) IN (3) > )>='08:00:00') THEN > > '00:00:00'::interval -- NO COLOCA LAS HORAS > > > WHEN ( (SELECT SUM(HORA) > FROM control_asistencia.presentismo_aux > WHERE personal_id= registros.personal_id > AND fecha NOT IN (registros.fecha) > AND EXTRACT (week from fecha)IN (3))<='07:59:00') THEN > > registros.hs_total::interval-'08:00:00'::interval --COLOCA LAS > HORAS > > ELSE > > registros.hs_total::interval-'08:00:00'::interval > > END > > > WHEN (registros.hs_total::interval > '08:49:00'::interval > AND (registros.hs_total::interval-'08:00:00'::interval)>='03:00:00' > AND EXTRACT (WEEK FROM registros.fecha)=4 )THEN > > CASE WHEN ( (SELECT SUM(HORA) > FROM control_asistencia.presentismo_aux > WHERE personal_id= registros.personal_id > AND fecha NOT IN (registros.fecha) > AND EXTRACT (week from fecha) IN (4))>='08:00:00') THEN > > '00:00:00'::interval -- NO COLOCA LAS HORAS > > WHEN ( (SELECT SUM(HORA) > FROM control_asistencia.presentismo_aux > WHERE personal_id= registros.personal_id > AND fecha NOT IN (registros.fecha) > AND EXTRACT (week from fecha) IN (4))<='07:59:00') THEN > > registros.hs_total::interval-'08:00:00'::interval --COLOCA LAS > HORAS > > ELSE > > registros.hs_total::interval-'08:00:00'::interval > > END > > WHEN (registros.hs_total::interval > '08:49:00'::interval > AND (registros.hs_total::interval-'08:00:00'::interval)>='03:00:00' > AND EXTRACT (WEEK FROM registros.fecha)=5 )THEN > > CASE WHEN ( (SELECT SUM(HORA) > FROM control_asistencia.presentismo_aux > WHERE personal_id= registros.personal_id > AND fecha NOT IN (registros.fecha) > AND EXTRACT (week from fecha) IN (5))>='08:00:00') THEN > > '00:00:00'::interval -- NO COLOCA LAS HORAS > > WHEN ( (SELECT SUM(HORA) > FROM control_asistencia.presentismo_aux > WHERE personal_id= registros.personal_id > AND fecha NOT IN (registros.fecha) > AND EXTRACT (week from fecha) IN (5))<='07:59:00') THEN > > registros.hs_total::interval-'08:00:00'::interval --COLOCA LAS > HORAS > > ELSE > > registros.hs_total::interval-'08:00:00'::interval > > END > > WHEN (registros.hs_total::interval -'08:00:00') < > '00:00:00'::interval THEN > '00:00:00'::interval > ELSE > (registros.hs_total::interval -'08:00:00') > END > END AS normativas_70 > FROM tabla registros > WHERE registros.personal_id=? > AND registros.fecha BETWEEN '2018-01-01' AND '2018-01-31' > AND (registros.dia NOT LIKE ('S%') > OR registros.dia NOT LIKE ('Do%')) > ORDER BY registros.fecha; > > Espero les parezca interesante y puedan ayudarme. > > > Agradecida.. > > -- ________________________________________ Lo bueno de vivir un dia mas es saber que nos queda un dia menos de vida