Home > Software design >  SQL Server, running total, reset for each month and sum again
SQL Server, running total, reset for each month and sum again

Time:03-30

I have a calendar table where working days are marked. Now I need a running total called "current_working_day" which sums up the working days until the end of a month and restarts again.

This is my query:

select
WDAYS.Date,
WDAYS.DayName,
WDAYS.WorkingDay,
sum(WDAYS.WorkingDay) OVER(order by (Date), MONTH(Date), YEAR(Date))  as 'current_working_day',
sum(WDAYS.WorkingDay) OVER(PARTITION by YEAR(WDAYS.Date), MONTH(WDAYS.Date) ) total_working_days_per_month
from WDAYS
where YEAR(WDAYS.Date) = 2022

This is my current output

Date DayName WorkingDay current_working_day total_working_days_per_month
2022-01-27 Thursday 1 19 21
2022-01-28 Friday 1 20 21
2022-01-29 Saturday 0 20 21
2022-01-30 Sunday 0 20 21
2022-01-31 Monday 1 21 21
2022-02-01 Tuesday 1 22 20
2022-02-02 Wednesday 1 23 20
2022-02-03 Thursday 1 24 20

But the column "current_workind_day" should be like this

Date DayName WorkingDay current_working_day total_working_days_per_month
2022-01-27 Thursday 1 19 21
2022-01-28 Friday 1 20 21
2022-01-29 Saturday 0 20 21
2022-01-30 Sunday 0 20 21
2022-01-31 Monday 1 21 21
2022-02-01 Tuesday 1 1 20
2022-02-02 Wednesday 1 2 20
2022-02-03 Thursday 1 3 20

Thanks for any advice.

CodePudding user response:

You can try to use PARTITION by with EOMONTH function which might get the same result but better performance, then you might only need to order by Date instead of using the function with the date.

select
  WDAYS.Date,
  WDAYS.DayName,
  WDAYS.WorkingDay,
  sum(WDAYS.WorkingDay) OVER(PARTITION by EOMONTH(WDAYS.Date) order by Date)  as 'current_working_day',
  sum(WDAYS.WorkingDay) OVER(PARTITION by EOMONTH(WDAYS.Date) ) total_working_days_per_month
from WDAYS
where YEAR(WDAYS.Date) = 2022

CodePudding user response:

You could just calculate the sum over a partitioned bucket based on the Month and Year of the date column.

select
WDAYS.Date,
WDAYS.DayName,
WDAYS.WorkingDay,
sum(WDAYS.WorkingDay) OVER(partition by YEAR(date),MONTH(Date) order by 
Date)  as 'current_working_day',
sum(WDAYS.WorkingDay) OVER(PARTITION by YEAR(WDAYS.Date), MONTH(WDAYS.Date) ) total_working_days_per_month
from WDAYS
where YEAR(WDAYS.Date) = 2022
  • Related