Je vais essayer de faire un graphique à partir des données de ma base de données SQL Server. J'aurai toutes les rues avec le nombre d'utilisateurs qui vivent dans cette rue, même le nombre est nul.
Pour cela, j'ai essayé cette requête:
Create table Streets(
ID int IDENTITY primary key,
Name varchar(100)
);
create table users(
ID int IDENTITY primary key,
Username varchar(100),
StreetID int references Streets(id)
);
insert into streets values ('1st street'), ('2nd street'), ('3rd street'),
('4th street'), ('5th street');
insert into users values ('Pol', 1), ('Doortje', 1), ('Marc', 2), ('Bieke', 2),
('Paulien', 2), ('Fernand', 2), ('Pascal', 2), ('Boma', 3),
('Goedele', 3), ('Xavier', 4);
select s.name as street, count(s.name) as count
from users u inner join streets s on u.streetid = s.id
group by s.name
Et ça me donne cette sortie:
| | street | count |
| - | ---------- | ----- |
| 1 | 1st street | 2 |
| 2 | 2nd street | 5 |
| 3 | 3rd street | 2 |
| 4 | 4th street | 1 |
Le problème est que la 5ème rue, où aucun utilisateur ne vit, n'apparaît pas sur le résultat. Puis-je faire cela avec SQL Server? Ici tu as un violon
Mise à jour: si je le fais right join
, j'ai ce résultat:
| | street | count |
| - | ---------- | ----- |
| 1 | 1st street | 2 |
| 2 | 2nd street | 5 |
| 3 | 3rd street | 2 |
| 4 | 4th street | 1 |
| 5 | 5th street | 1 |
sql-server
join
group-by
H. Pauwelyn
la source
la source
COUNT(u.streetid)
right join
et ceright outer join
sont les mêmes choses. J'ai ajouté une explication dans ma réponse comme suggéré par @ jpmc26.Réponses:
La raison pour laquelle votre requête n'a pas fonctionné comme prévu:
La jointure interne vous donne l'intersection de 2 tables. Dans votre cas, il n'y avait aucune entrée pour
5th street
dans votre table d'utilisateurs et c'est pourquoi join n'a produit aucune entrée pour cela.La jointure externe (droite ou gauche) donnera le résultat de la jointure interne et en plus tous les enregistrements non éligibles du tableau de gauche ou de droite selon le type (gauche ou droite) de jointure externe.
Dans ce cas, j'ai mis Street à gauche de la jointure et utilisé la jointure externe gauche comme vous vouliez toutes les rues (même le nombre est nul) dans votre jeu de résultats.
Remplacez votre requête de sélection par ceci.
Résultat
la source
C'est une façon possible.
la source
Nettoyage du code pour travailler sur une instance sensible à la casse ...
Lorsque vous utilisez
COUNT
un nom de colonne, il compte lesNOT NULL
valeurs.J'utilise un
RIGHT JOIN
ici pour apaiser Joe Obbish.Résultats:
la source
Voici la courte requête:
la source