string_agg postgres functions examples example ejemplos create array_to_string array_agg array agg sql postgresql aggregate-functions

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