Это было написано против исходного вопроса:
select first 50
c.id,
(select trim(fullname) from entity where id = c.id) fullname,
count(*),
(select count(*) from courses where id = c.id and grd like 'FN%') FN,
(select count(*) from courses where id = c.id and grd like 'W%') W
from courses c
group by 1
По какой-то причине подзапрос для получения имени выполняется намного быстрее, чем при использовании объединения.
Edit:
Следующие действия будут такими же, как и у ответа yukondude, но они лучше работают на нашей коробке HPUX / Informix v10.00.HC5.
select c.id
from courses c
where not exists (
select id
from courses
where (grd not like 'W%' and grd not like 'FN%')
and id = c.id
)
group by 1