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

Reply via email to