sql - postgres - ¿Cómo incluir los resultados "cero"/"0" en COUNT agregado?
postgresql string_agg (5)
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;
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. 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 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?
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()
función agregado count()
no contará los valores NULL
y, por lo tanto, obtendrá un cero.
Si desea obtener más información sobre las combinaciones externas, aquí hay un buen tutorial: http://sqlzoo.net/wiki/Using_Null
Para cambiar aún menos en su consulta original, puede convertir su unión en una combinación RIGHT
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 combinación externa está en la dirección RIGHT
, 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.
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.
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