Я бы порекомендовал два уровня агрегирования:
select count(*) as num_persons,
sum(group_1 > 0 and group_2 > 0) as in_both,
avg(group_1 > 0 and group_2 > 0) as ratio
from (select person,
max( group = 1 ) as group_1,
max( group = 2 ) as group_2
from t
group by person
) p
Мне это нравится, потому что он гибкий.
Однако вы также можете сделать это без подзапроса, предполагая ровно две группы:
select count(distinct person) as num_persons,
count(*) - count(distinct person) as num_in_both,
(count(*) - count(distinct person)) / count(distinct person) as ratio
from t;