Все таки сделайте динамически формируемым данные об интервалах, то есть inters можно представить в виде таблицы или генерировать на основе prepod.
Для "нет данных" можно определить интервал [null, null]:
select case
when a.begin is null and a.end is null then 'нет данных'
when a.begin is not null and a.end is not null then concat(a.end, '-', a.begin)
when a.begin is null and a.end is not null then concat('ранее ', a.end + 1)
when a.begin is not null and a.end is null then concat('от ', a.begin)
end interval_str,
cnt
from
(
select inters.begin, inters.end, count(prepod.name) cnt
from
(
select null begin, 1969 end union all
select 1970 begin, 1979 end union all
select 1980 begin, 1989 end union all
select 1990 begin, 1999 end union all
select 2000 begin, null end union all
select null begin, null end -- запись для тех, у кого нет данных др.
) inters -- таблица с интервалами
left join
(
select 'a' name, STR_TO_DATE('2013-02-11', '%Y-%m-%d') date_r union all
select 'aa' name, STR_TO_DATE('2010-09-01', '%Y-%m-%d') date_r union all
select 'b' name, STR_TO_DATE('1968-02-11', '%Y-%m-%d') date_r union all
select 'bb' name, STR_TO_DATE('1969-01-21', '%Y-%m-%d') date_r union all
select 'c' name, STR_TO_DATE('1980-02-11', '%Y-%m-%d') date_r union all
select 'd' name, STR_TO_DATE('1989-02-11', '%Y-%m-%d') date_r union all
select 'z' name, null date_r -- препод, у которого нет данных др.
) prepod on inters.begin <= year(prepod.date_r) and inters.end >= year(prepod.date_r)
or inters.begin is null and inters.end >= year(prepod.date_r)
or inters.begin <= year(prepod.date_r) and inters.end is null
or prepod.date_r is null and inters.begin is null and inters.end is null
group by inters.begin, inters.end
order by inters.begin desc, inters.end desc
) a