I have a set of data where value is calculated starting from 1 – 12 then moves 1 step down and calculates another 1 – 12. This works well in Excel however how do I achieve this in SQL.
Is it even possible?
I have tried
x
ROW_COUNT = ROW_NUMBER()OVER(PARTITION BY StudioMain ORDER BY Finperiod ASC)/13+1,
which gives me a list of numbers then restarts after 12
so I want to sum rows 1-12 then I want to sum rows 1-12 but starting at row 2 ending at row 13 then sum rows 1-12 starting at row 3 ending at row 14
How do I sum row 1 12 then restart sum 1-12 but from row 2?
Advertisement
Answer
It looks like you want a window sum with a row
frame:
select
t.*,
Debtors / sum(GrossSales) over(
partition by StudioMain
order by Finperiod
rows between 11 preceding and current row
) DeptorDays
from mytable t
order by StudioMain, FinPeriod
If you want no results for the 11 first rows, as shown in your image, you can wrap the sum()
in a conditional expression:
select
t.*,
case when row_number() over(partition by StudioMain order by Finperiod) >= 12
then Debtors / sum(GrossSales) over(
partition by StudioMain
order by Finperiod
rows between 11 preceding and current row
)
end DeptorDays
from mytable t
order by StudioMain, FinPeriod