2018-02-08 11:40 GMT-05:00 Brunhilde Sibeth <bruma13sib...@gmail.com>:
> Buenas a todos!
>
> Es la primera vez que consulto a la lista, espero puedan ayudarme y reciba
> alguna orientación o respuesta.
> En la actualidad me estoy familiarizando con el postgresql.
>
> Lo que necesito es sumar una columna de una tabla (valor en horas) , el
> inconveniente que encuentro es que la suma debe ser por semana, dentro del
> rango de un mes.
>
> Tengo algo armado así, pero necesito que el control me haga detectando la
> fecha de inicio y fin de la semana
> según la fecha en la que está el puntero (hace un recorrido por fila /fecha
> dentro de la tabla), esta consulta sería una condición para realizar otra
> operación dentro de un CASE, ya que la cantidad de la suma de horas no debe
> ser mayor a 8 hs en una semana.
>
> Espero ansiosa que puedan ayudarme.
>
> SELECT SUM(HORAS)
> FROM tabla
> WHERE personal_id= ?
> AND fecha BETWEEN ‘2018-02-01’ AND ‘2018-02-28’
> AND EXTRACT (DOW from fecha) IN (1,2,3,4,5,6)
> ORDER BY fecha
>

alguna razón por la que pides que ignore el domingo? "EXTRACT (DOW
from fecha) IN (1,2,3,4,5,6)"

Ahora, para que la suma sea por semana deberías usar algo así aunque
se te dará el número de semana del año. Si quieres el número de semana
del mes habría que ver tu definición de semana; por ejemplo: si el mes
empieza en domingo, esa sería la primera semana? o la siguiente?
especialmente considerando que estas ignorando los domingos pero la
misma pregunta se puede hacer si el mes empieza en sábado o cuentas de
sábado a sábado?

SELECT EXTRACT(week from fecha), SUM(HORAS)
   FROM tabla
 WHERE personal_id= ?
      AND fecha BETWEEN ‘2018-02-01’ AND ‘2018-02-28’
      AND EXTRACT (DOW from fecha) IN (1,2,3,4,5,6)
 GROUP BY 1
 ORDER BY fecha;

una posible solución si cuentas la semana de domingo a domingo sería:

SELECT EXTRACT(week from fecha), SUM(HORAS)
   FROM tabla
 WHERE personal_id= ?
      AND fecha BETWEEN ‘2018-02-01’ AND ‘2018-02-28’
 GROUP BY EXTRACT(week from fecha)
 ORDER BY 1;

o

WITH horas_semana (semana, horas) AS (SELECT EXTRACT(week from fecha),
SUM(HORAS)
                                                                  FROM tabla
                                                                WHERE
personal_id= ?

AND fecha BETWEEN ‘2018-02-01’ AND ‘2018-02-28’
                                                                GROUP
BY EXTRACT(week from fecha))
SELECT row_number() over (), horas
   FROM horas_semana
 ORDER BY semana;


-- 
Jaime Casanova                      www.2ndQuadrant.com
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

Reply via email to