• I am taking a guess, but something like this:

    -- Setup sample table a and data.

    create table #TestData(

    ContractNumber int,

    StartDate date,

    RentalAmount int,

    RentalFrequency varchar(10)

    );

    insert into #TestData

    values (12345,'2013-01-01',100,'Quarterly'),

    (23456,'2014-02-01',125,'Monthly'),

    (34567,'2014-02-01',135,'Quarterly'),

    (23456,'2014-02-01',150,'Annual');

    with e1(n) as (select 1 from (values (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))dt(n)),

    e2(n) as (select 1 from e1 a cross join e1 b),

    e4(n) as (select 1 from e2 a cross join e2 b),

    eTally(n) as (select row_number() over (order by (select null)) from e4 a cross join e2 b)

    select

    td.ContractNumber,

    rd.RentalDate,

    td.RentalAmount

    from

    #TestData td

    cross apply (select top (datediff(month, td.StartDate, getdate()) / case td.RentalFrequency when 'Monthly' then 1 when 'Quarterly' then 3 when 'Annual' then 12 end + 1)

    dateadd(month, (n - 1) * case td.RentalFrequency when 'Monthly' then 1 when 'Quarterly' then 3 when 'Annual' then 12 end, td.StartDate)

    from

    eTally) rd(RentalDate);

    -- drop test data

    drop table #TestData;