下面是我的表格结构。我需要为每个房产计算租赁期限的租金:
让我们看一下PropertyID = 12077:
由于该物业租赁在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
答案 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]