Quiere una combinación externa para esto (y necesita usar person como la tabla "conductora")
SELECT person.person_id, COUNT(appointment.person_id) AS "number_of_appointments"
FROM person
LEFT JOIN appointment ON person.person_id = appointment.person_id
GROUP BY person.person_id;
La razón por la que esto funciona es que la combinación externa (izquierda) devolverá NULL para aquellas personas que no tengan cita. La función agregada count() no contará NULL valores y por lo tanto obtendrá un cero.
Si desea obtener más información sobre las uniones externas, aquí hay un buen tutorial:https://sqlzoo.net/wiki/Using_Null