Re: Suma de columna en una semana

From: "Miguel Beltran R(dot)" <yourpadre(at)gmail(dot)com>
To: pgsql-es-ayuda <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Suma de columna en una semana
Date: 2018-02-10 02:56:30
Message-ID: CAEc04cqRpPXdCoALUFsp8FCCNZwuF9YzSSuRj-qG+N7G0_pquA@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Te estas complicando muchisimo, te comento entre-lineas

El 9 de febrero de 2018, 11:30, Brunhilde Sibeth <bruma13sibeth(at)gmail(dot)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

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message José Fermín Francisco Ferreras 2018-02-11 04:12:26 Manual Android studio + postgresql
Previous Message Brunhilde Sibeth 2018-02-09 17:30:13 Re: Suma de columna en una semana