Расчет диапазона дат для дохода проекта в SQL? - PullRequest
1 голос
/ 26 января 2020

У меня есть таблица ClientProfile, которая содержит столбец с именем StartDate, тип данных этого столбца равен date, второй столбец называется MonthlyRevenue, который представляет собой столбец суммы в numeric(18,2) и третий столбец. называется ContractMonths тип данных int, который указывает количество месяцев, в течение которых проект будет активен. Пользователь должен выбрать диапазон дат, и запрос должен иметь возможность извлекать полный диапазон дат (с разбивкой по месяцам), указав сумму для каждого месяца.

Например:
Будет запущен проект A с 2020-03-01 (1st March), и контракт будет действовать в течение 6 месяцев, поэтому, когда пользователь выбирает даты 02-2020 до 12-2020.

, я должен получить такой результат:

Month     Revenue
-----------------   
02-2020   0
03-2020   100
04-2020   100
05-2020   100
06-2020   100
07-2020   100
08-2020   100
09-2020   0
10-2020   0
11-2020   0
12-2020   0

Я был бы очень признателен за любую помощь, потому что я застрял в этой точке и не могу понять это.

1 Ответ

0 голосов
/ 26 января 2020

Один метод - это рекурсивный CTE для генерации месяцев:

with months as (
      select @startmonth as mon
      union all
      select dateadd(month, 1, mon)
      from months
      where mon < @endmonth
     )
select months.mon, coalesce(cp.monthlyrevenue, 0) as revenue
from months left join
     clientprofile cp
     on cp.project = @project and
        cp.startdate <= months.mon and
        dateadd(month, cp.contractmonths, cp.startdate) >= months.mon;

Если период может превышать 100 месяцев, вам нужно добавить option (maxrecursion 0).

В качестве альтернативы вы можете построить Ежемесячная таблица календаря в вашем приложении и делать то же самое, используя эту таблицу напрямую.

...