2017-11-14 2 views
0

다음은 내 테이블 구조입니다. 나는 각 속성에 대한 임대 기간에 대한 임대료를 계산해야합니다전년 대비 증가량 계산 SQL Server 2008R2

  • 지역 = 1280
  • 의 startDate = 2023년 2월 1일
  • 종료 날짜 = 2027- :

    는 이제 부동산 ID = 12077 살펴 보자 10-31

  • BaseRent = 21.53
  • RentIncreasePercent = 0.04 (4 %) = 12개월
  • IncreaseRepeatMonths (참고 : 최초 12 회 개월 다시 증가하지 않을 것임)

이 자산 임대는 2023 년과 2028 년 사이에 시작하고 끝나기 때문에 매년 수집해야하는 임대료 금액을 알고 싶습니다. 이것은 12 개월마다 증가하는 비율 (복합 임대료 인상)을 고려할 것입니다.

예 :
21.53 * 1280은 처음 12 개월 동안 집세를냅니다. 그러나 2 월에 임대가 시작되어 2023 년에 임대료 총액 = ((21.23 * 1280)/12) * 11

2024 년의 경우 임대료 만료이므로 첫 달 임대료 = (21.23 * 1280)/12가됩니다. 12 개월마다 증가합니다. 1224 년의 다음 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

순수 SQL (NO T-SQL)에 그것을 할 의도가 SQL 2008에서 작동합니다 희망? – SmartDumb

+1

당신이해야 할 일은 달력 연도와 '임대'연도를 사용하여 날짜 범위를 월 단위로 분해하는 것입니다. 따라서 시작일은 2 개월, 2023 년, 임대 년 0입니다. 다음 행 3 월, 2023 년 임대, 0 년 임대. 12 번째 행은 1 월 (1 월), 2024 년 임대, 13 번째 달은 임대입니다. 2, cal yr 2024, yr yy 1 그러면 달력을 분리하고 임대료 인상을위한 승수로 사용 된 '임대'월에 필요한 데이터가 있어야합니다. – Beth

+0

@SmartDumb보기에서 다른 저장 프로 시저 논리로 연결하는 것이 필요합니다. 그러나 성능이 있다면 t-SQL도 잘 작동합니다. 하루가 끝나면 데이터는 복잡한 ssrs 보고서에서 사용됩니다. – NonProgrammer

답변

2

나는 테이블에서 모든 개월 containts 달력 테이블을 사용하는 것이 좋습니다. 내 예

-- 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] 
+0

이것은 완벽하게 작동했습니다! 나는 YearRentAmount 수식 만 업데이트해야했습니다. 당신이 가지고있는 것은 복합 비율을 계산하지 않는 것입니다. – NonProgrammer

+0

공식은 다음과 같습니다. (BaseRent * Area * (Power (cast) (1 + RentIncreasePercent as float), IncreaseCount))))/12 – NonProgrammer

관련 문제