Это вопрос объединения таблиц. Я думаю, что вы все смущены псевдонимами таблиц при самообъединении. Так что дайте им значимые псевдонимы:
p
для человека pp
для родителей человека gp
для бабушка и дедушка этого человека
Затем, когда у вас есть правильные значения JOIN
, остальное в основном агрегирует:
SELECT p.name, p.id,
SUM(CASE WHEN gp.date_of_death IS NULL THEN 1 ELSE 0 END)
FROM persons p JOIN -- persons
persons pp -- parents
ON pp.id IN (p.father_id, p.mother_id) JOIN
persons gp
ON gp.id IN (pp.father_id, pp.mother_id)
GROUP BY p.name, p.id;
Обратите внимание на условную сумму, которая включает дату смерти .