Ich werde versuchen, aus den Daten meiner SQL Server-Datenbank ein Diagramm zu erstellen. Ich werde alle Straßen mit der Anzahl der Benutzer haben, die in dieser Straße leben, auch wenn die Anzahl Null ist.
Dafür habe ich diese Abfrage versucht:
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
Und es gibt mir diese Ausgabe:
| | street | count |
| - | ---------- | ----- |
| 1 | 1st street | 2 |
| 2 | 2nd street | 5 |
| 3 | 3rd street | 2 |
| 4 | 4th street | 1 |
Das Problem ist, dass die 5. Straße, in der kein Benutzer lebt, nicht im Ergebnis angezeigt wird. Könnte ich das mit SQL Server machen? Hier hast du eine Geige
Update: Wenn ja right join
, habe ich folgendes Ergebnis:
| | 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
quelle
quelle
COUNT(u.streetid)
right join
undright outer join
sind die gleichen Dinge. Ich habe meiner Antwort eine Erklärung hinzugefügt, wie von @ jpmc26 vorgeschlagen.Antworten:
Der Grund, warum Ihre Abfrage nicht wie beabsichtigt funktioniert hat:
Inner Join gibt Ihnen den Schnittpunkt von 2 Tabellen. In Ihrem Fall gab es keinen Eintrag für
5th street
in Ihrer Benutzertabelle, und aus diesem Grund hat join keinen Eintrag dafür erstellt.Die äußere Verknüpfung (rechts oder links) gibt das Ergebnis der inneren Verknüpfung und zusätzlich alle nicht qualifizierenden Datensätze aus der linken oder rechten Tabelle an, abhängig vom Typ (links oder rechts) der äußeren Verknüpfung.
In diesem Fall habe ich Street links vom Join platziert und den linken äußeren Join verwendet, da Sie alle Straßen (gerade Anzahl ist Null) in Ihrer Ergebnismenge haben möchten.
Ändern Sie Ihre Auswahlabfrage in diese.
Ergebnis
quelle
Dies ist ein möglicher Weg.
quelle
Bereinigen von Code für die Arbeit an einer Instanz, bei der zwischen Groß- und Kleinschreibung unterschieden wird ...
Wenn Sie
COUNT
einen Spaltennamen verwenden, werden dieNOT NULL
Werte gezählt.Ich benutze ein
RIGHT JOIN
hier, um Joe Obbish zu beschwichtigen.Ergebnisse:
quelle
Hier ist die kurze Abfrage:
quelle