计算年度增长SQL Server 2008R2

时间:2017-11-14 20:37:16

标签: sql sql-server-2008-r2 calculated-columns

下面是我的表格结构。我需要为每个房产计算租赁期限的租金:

让我们看一下PropertyID = 12077:

  • 面积= 1280
  • StartDate = 2023-02-01
  • EndDate = 2027-10-31
  • BaseRent = 21.53
  • RentIncreasePercent = .04(4%)
  • IncreaseRepeatMonths = 12个月(注意:前12个月不会有任何增加)

由于该物业租赁在2023年至2028年之间开始和结束,我想知道(每年单独一行)每年收取的租金数额。这将考虑每12个月增加百分比(复合租金增加)。

例:
21.53 * 1280将在前12个月提供租金。但是,租约从2月开始,因此2023年的总租金金额将是=((21.23 * 1280)/ 12)* 11

对于2024年,第一个月的租金将是=(21.23 * 1280)/ 12,因为租金只会每12个月增加一次。在2024年的未来11个月,租金将是((12.23 * 1.04 * 1280)/ 12)* 11.

对于2025年,第一个月的租金为(12.23 * 1.04 * 1280)/ 12)。然而,2025年的未来11个月将是((12.72 * 1.04 * 1280)/ 12)* 11。 12.72来自复合增长。

我如何提出这样做​​的观点?对我来说最令人困惑的部分是不知道在1月份没有开始时如何容纳租约开始日期。

declare @table table 
(
    PropertyID int,
    area int,
    StartDate date,
    EndDate date,
    BaseRent decimal(12,2),
    RentIncreaseBasis varchar(30),
    RentIncreasePercent decimal(5,2),
    IncreaseRepeatMonths int

)

insert @table values (12076,    5627,   '2024-01-01',   '2028-12-31',   '16.52',    '% Increase',   0.03, 12)
insert @table values (12077,    1280,   '2023-02-01',   '2027-10-31',   '21.53',    '% Increase',   0.04, 12)
insert @table values (12078,    1000,   '2017-03-01',   '2025-11-30',   '23.52',    '% Increase',   0.01, 12)
insert @table values (12079,    2000,   '2020-02-01',   '2024-09-30',   '15.57',    '% Increase',   0.05, 12)
insert @table values (12080,    3000,   '2018-05-01',   '2020-08-31',   '18.58',    '% Increase',   0.04, 12)
insert @table values (12081,    4000,   '2019-08-01',   '2020-12-31',   '22.56',    '% Increase',   0.03, 12)
insert @table values (12082,    5000,   '2017-02-01',   '2028-03-31',   '19.53',    '% Increase',   0.02, 12)

select * from @table

1 个答案:

答案 0 :(得分:2)

我建议使用一张日历表,其中包含表格中的所有月份。 我希望我的示例能在SQL 2008中运行。

-- here is your code

-- the calendar table
DECLARE @MonthCalendar table(
  [Month] date PRIMARY KEY
)

DECLARE @MinDate date,@MaxDate date

-- get min and max date
SELECT
  @MinDate=MIN(StartDate),
  @MaxDate=MAX(EndDate)
FROM @table

-- fill the calendar table
;WITH monthCTE AS(
  SELECT CAST(@MinDate AS date) [Month]

  UNION ALL

  SELECT DATEADD(MONTH,1,[Month])
  FROM monthCTE
  WHERE [Month]<@MaxDate
)
INSERT @MonthCalendar([Month])
SELECT [Month]
FROM monthCTE
OPTION(MAXRECURSION 0);

-- final query
SELECT
  *,
  (BaseRent*Area*(1+RentIncreasePercent*IncreaseCount))/12 MonthRentAmount,
  (1+RentIncreasePercent*IncreaseCount) TotalPercent
FROM
  (
    SELECT *,(ROW_NUMBER()OVER(PARTITION BY t.PropertyID ORDER BY m.[Month])-1)/12 IncreaseCount
    FROM @table t
    JOIN @MonthCalendar m ON m.[Month] BETWEEN t.StartDate AND t.EndDate
    --WHERE t.PropertyID=12077
  ) q

-- query for total amounts by PropertyIDs and Years
SELECT
  PropertyID,
  YEAR(StartDate) [Year],
  SUM((BaseRent*Area*(1+RentIncreasePercent*IncreaseCount))/12) YearRentAmount
FROM
  (
    SELECT *,(ROW_NUMBER()OVER(PARTITION BY t.PropertyID ORDER BY m.[Month])-1)/12 IncreaseCount
    FROM @table t
    JOIN @MonthCalendar m ON m.[Month] BETWEEN t.StartDate AND t.EndDate
    --WHERE t.PropertyID=12077
  ) q
GROUP BY PropertyID,YEAR(StartDate)
ORDER BY PropertyID,[Year]