¿Cómo include los resultados "cero" / "0" en COUNT agregado?

Me acabo de pegar un poco con algunos SQL. No creo poder formular la pregunta shinymente, así que déjame mostrarte.

Tengo dos tables, una llamada persona, una llamada cita. Estoy intentando devolver el número de citas que tiene una persona (incluso si tienen cero). La cita contiene el person_id y hay un person_id por cita. Entonces COUNT(person_id) es un enfoque sensato.

La consulta:

 SELECT person_id, COUNT(person_id) AS "number_of_appointments" FROM appointment GROUP BY person_id; 

Volverá correctamente, la cantidad de citas que tiene un id_personal. Sin embargo, una persona que tiene 0 citas no es devuelta (obviamente, ya que no están en esa tabla).

Ajustar la statement para tomar person_id de la tabla de personas me da algo así como:

 SELECT person.person_id, COUNT(appointment.person_id) AS "number_of_appointments" FROM appointment JOIN person ON person.person_id = appointment.person_id GROUP BY person.person_id; 

¡Sin embargo, esto solo devolverá un id_persona que tenga una cita y no lo que yo quiero, que es una devolución con personas que tienen 0 citas!

Alguna sugerencia por favor?

Desea una combinación externa para esto (y debe usar a la persona como la tabla de "conducción")

 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 a aquellas personas que no tengan una cita. El count() function agregado count() no contará los valores NULL y, por lo tanto, obtendrá un cero.

Si desea get más información sobre las combinaciones externas, aquí hay un buen tutorial: http://sqlzoo.net/wiki/Using_Null

Debes usar LEFT JOIN lugar de INNER JOIN

 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; 

si haces la combinación externa (con el recuento) y luego utilizas este resultado como subtabla, puedes get 0 como se esperaba (gracias a la function nvl)

Ex:

 select P.person_id, nvl(A.nb_apptmts, 0) from (SELECT person.person_id FROM person) P LEFT JOIN (select person_id, count(*) as nb_apptmts from appointment group by person_id) A ON P.person_id = A.person_id 

USE join para get 0 count en el resultado utilizando GROUP BY.

simplemente 'join' se une internamente en MS SQL, por lo tanto, vaya para join a la izquierda o a la derecha.

Si la tabla que contiene la key principal se menciona primero en QUERY, utilice IZQUIERDA o DERECHA.

P.EJ:

 select WARDNO,count(WARDCODE) from MAIPADH right join MSWARDH on MSWARDH.WARDNO= MAIPADH.WARDCODE group by WARDNO 

.

 select WARDNO,count(WARDCODE) from MSWARDH left join MAIPADH on MSWARDH.WARDNO= MAIPADH.WARDCODE group by WARDNO 

Tome el grupo de la tabla que tiene la key primaria y el recuento de la otra tabla que tiene inputs / detalles reales.