SQL - расчет финансового года с начала года - PullRequest
0 голосов
/ 05 июля 2018

Я пытаюсь рассчитать итоговые значения по годам, группирую запрос по календарному году, но у меня есть столбец, в котором указано время в минутах с начала финансового года (т. Е. С 1 апреля того же года, в котором произошел месяц, если месяц > = Апрель в противном случае 1 апреля предыдущего года)

Я пробовал это с помощью следующего скрипта, но не могу использовать оператор case в предложении sum () over ().

    declare @yearmonth int = 4
declare @NumPreceeding int = case when right(@yearmonth,2) in (01,02,03) then 9+right(@yearmonth,1) 
                                                                                    else (((12-(right(@yearmonth,2)+8)))*(-1)) 
                                                                                                                    end
select  ColumnDescription
       ,sum(TotalMinutes) [TotalMinutes]
          ,sum(sum(TotalMinutes)) over (order by YearMonth rows between cast(@NumPreceeding as int) preceding and current row)
          ,YearMonth
from MyTable
where yearmonth between '201704' and '201706'
group by ColumnDescription ,YearMonth
order by yearmonth

Вы знаете, как я могу заставить это работать?

1 Ответ

0 голосов
/ 05 июля 2018

Если вам нужны кумулятивные суммы, то я бы ожидал:

select ColumnDescription, YearMonth, sum(TotalMinutes) as TotalMinutes,
       sum(sum(TotalMinutes)) over (partition by ColumnDescription order by YearMonth) as running_TotalMinutes
from MyTable
where yearmonth between '201704' and '201706'
group by ColumnDescription, YearMonth
order by yearmonth;

Если вы хотите сделать это в течение нескольких лет, то вам нужно извлечь финансовый год. Это немного громоздко, но выполнимо:

select ColumnDescription, YearMonth, sum(TotalMinutes) as TotalMinutes,
       sum(sum(TotalMinutes)) over (partition by ColumnDescription, v.fiscal_year order by YearMonth) as running_TotalMinutes
from MyTable t cross apply
     (values (case when right(yearmonth, 2) >= '04' then cast(left(yearmonth, 4) as int)
                   else cast(left(yearmonth, 4) as int) - 1
              end)
     ) v(fiscal_year)
group by ColumnDescription, YearMonth
order by yearmonth;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...