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


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

Tengo dos mesas, 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. Asi que 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 declaración 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?


76
2018-02-09 23:59


origen


Respuestas:


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 está funcionando es que la unión externa (izquierda) regresará NULL para aquellas personas que no tienen cita. La función agregada count() no contará NULL valores y así obtendrá un cero.

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


67
2018-02-10 00:04



Debes usar LEFT JOIN en 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;

17
2018-02-10 00:03



si haces la combinación externa (con el recuento) y luego utilizas este resultado como subtabla, puedes obtener 0 como se esperaba (gracias a la función 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

4
2018-01-20 13:30



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

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

Si la tabla que contiene la clave 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 clave primaria y el recuento de la otra tabla que tiene entradas / detalles reales.


2
2017-11-09 10:55



Para cambiar aún menos en su consulta original, puede convertir su unión en una RIGHT unirse

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

Esto solo se basa en la respuesta seleccionada, pero como la unión externa está en el RIGHT dirección, solo se necesita agregar una palabra y menos cambios. - Solo recuerda que está ahí y, a veces, puede hacer que las consultas sean más legibles y requiera menos reconstrucción.


0
2018-06-28 12:21