Comment inclure “zéro” / “0” résultats dans agrégat COUNT?
Je viens tout juste de me suis un peu coincé avec une SQL. Je ne pense pas que je peux formuler la question avec brio - alors laissez-moi vous montrer.
J'ai deux tables, une personne appelée, l'une appelée rendez-vous. Je suis en train de retourner le nombre de rendez-vous a une personne (y compris s'ils ont zéro). Rendez-vous contient la person_id
et il y a un person_id
par rendez-vous. Donc COUNT(person_id)
est une approche pratique.
La requête:
SELECT person_id, COUNT(person_id) AS "number_of_appointments"
FROM appointment
GROUP BY person_id;
Sera de retour correctement, le nombre de rendez-vous un person_id a. Toutefois, une personne qui a 0 rendez-vous n'est pas retournée (évidemment, comme ils ne sont pas dans ce tableau).
Peaufiner la déclaration de prendre person_id de la table personne me donne quelque chose comme:
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;
Cela, cependant, ne sera qu'un retour d'un person_id qui a un rendez-vous et pas ce que je veux, qui est un retour avec des personnes qui ont 0 rendez-vous!
Des suggestions s'il vous plaît?
- Que faire si je veux obtenir zéro | 0 comme résultat sur une seule table. J'ai vm_tool_licenses de table et de requête est comme ci-dessous, sélectionnez vm_tool_id, count(vm_tool_license_active) à partir de vm_tool_licenses groupe par vm_tool_license_active,vm_tool_id avoir vm_tool_license_active = false`
Vous devez vous connecter pour publier un commentaire.
Vous voulez une jointure externe pour cela (et vous devez utiliser de la personne comme le "moteur" de la table)
La raison pour laquelle cela ne fonctionne pas, c'est que l'extérieur (à gauche) de jointure sera de retour
NULL
pour les personnes qui n'ont pas de rendez-vous. La fonction d'agrégationcount()
ne comptera pasNULL
valeurs et ainsi vous aurez un zéro.Si vous voulez en savoir plus sur les jointures externes, voici un bon tutoriel: http://sqlzoo.net/wiki/Using_Null
Vous devez utiliser
LEFT JOIN
au lieu deINNER JOIN
si vous ne la jointure externe (avec le temps), et ensuite utiliser ce résultat comme un sous-tableau, vous pouvez obtenir de 0 comme prévu (grâce à la fonction nvl)
Ex:
UTILISER inscrivez-vous pour obtenir 0 comptent dans le résultat de l'utilisation de GROUP BY.
simplement "rejoindre" ne Inner join dans MS SQL , Aller à gauche ou à droite rejoindre.
Si la table qui contient la clé primaire est mentionné en premier dans la REQUÊTE, puis utiliser une jointure GAUCHE ailleurs pour le rejoindre.
Par exemple:
.
Prendre groupe par de la table qui a la clé Primaire et comte de l'autre table qui a des entrées/détails.
De changer encore moins de l'original de votre requête, vous pouvez transformer votre joindre en
RIGHT
rejoindreCe juste s'appuie sur la réponse choisie, mais comme la jointure externe est dans la
RIGHT
direction, un seul mot doit être ajouté et moins de changements. - Rappelez-vous juste qu'il est là et peut parfois faire des requêtes plus lisible et nécessitent moins de reconstruction.Le problème avec un LEFT JOIN, c'est que si il y a pas de rendez-vous, il sera toujours retourner une ligne avec une valeur nulle, qui lorsqu'elles sont agrégées par le COMTE va devenir 1, et il apparaît que la personne a un rendez-vous quand en réalité ils n'en ont pas. Je pense que cela va donner des résultats corrects: