trying to get more rows from the table than there actually exist
declare @t table(StudentID int, Month int, Year int, Present char(1));
    insert into @t 
    select 1, 1, 2016, 'P' union all
    select 1, 12, 2016, 'P' union all
    select 1, 4, 2017, 'P';

    select y.StudentID,
           y.y, m.m, 
           isnull(t.Present, 'A') as P 
    from
    (
    select StudentID, year as y       
    from @t
    group by StudentID, year
    ) y
    cross join

    (
    select number as m 
    from master..spt_values
    where type = 'p' and number between 1 and 12
    )m
    left join @t t
       on t.StudentID = y.StudentID and t.year = y.y  and t.month = m.m;


Explanation: we need as much rows as the number of students per number of years per 12 month, so I use cross join of distinct pairs student, year and 12 months. 

As we have SQL Server 2000, we cannot use Row_number() to generate 12 values, niether VALUES, so we can join to a number table (I used spt_values even if I personally have a number table until 10000000) or we could generate in other ways, for example like this :

select 1 as m union all select 2...union all select 12


And finally join the presence list to a generated 'calendar' for every student