Only tables AREA and ATTACK contains informations you need here (you don't want disease name),
so at first attach informations about attacks to table containing person ID:
select personid, count(diseaseid) cnt
from area left join attack using (areaid)
group by personid
PersonID Cnt
11 2
13 0
12 1
Now you can count ill and healthy persons:
select
count(case when cnt > 0 then 1 end) Affected,
count(case when cnt = 0 then 1 end) NotAffected
from (
select personid, count(diseaseid) cnt
from area left join attack using (areaid)
group by personid)
Affected NotAffected
2 1
SQLFiddle demo
There are several ways to get last output, try to find others. And example how to join all three tables:
select personid, count(diseaseid) cnt,
listagg(DiseaseName, ', ') within group (order by DiseaseName) Diseases
from area
left join attack using (areaid)
left join disease using (diseaseid)
group by personid
PERSONID CNT DISEASES
-------- ---- ----------
11 2 ABC, DEF
12 1 ABC
13 0
If you want to find only affected persons use INNER JOIN
instead of LEFT
.