146 votes

Comment inclure les résultats "zéro" / "0" dans l'agrégat COUNT ?

Je me suis juste retrouvé un peu coincé avec du SQL. Je ne pense pas pouvoir formuler la question brillamment - alors laissez-moi vous montrer.

J'ai deux tables, une appelée personne, une appelée rendez-vous. J'essaie d'obtenir le nombre de rendez-vous d'une personne (y compris si elle n'en a aucun). Rendez-vous contient le person_id et il y a un person_id par rendez-vous. Donc COUNT(person_id) est une approche raisonnable.

La requête :

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

Retourne correctement le nombre de rendez-vous d'un person_id. Cependant, une personne qui n'a pas de rendez-vous n'est pas retournée (évidemment, car elle ne figure pas dans cette table).

En modifiant l'instruction pour prendre person_id dans la table person, j'obtiens quelque chose comme ça :

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;

Cependant, cela ne retournera qu'un identifiant de personne qui a un rendez-vous et non ce que je veux, c'est-à-dire un retour avec des personnes qui n'ont pas de rendez-vous !

Des suggestions, s'il vous plaît ?

3voto

dannyw Points 76

Le problème avec un LEFT JOIN est que s'il n'y a pas de rendez-vous, il retournera toujours une ligne avec un null, qui une fois agrégé par COUNT deviendra 1, et il apparaîtra que la personne a un rendez-vous alors qu'en réalité elle n'en a aucun. Je pense que cela donnera les résultats corrects :

SELECT person.person_id,
(SELECT COUNT(*) FROM appointment WHERE person.person_id = appointment.person_id) AS 'Appointments'
FROM person;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X