Spróbuję utworzyć wykres z danych z mojej bazy danych serwera SQL. Będę mieć wszystkie ulice z liczbą użytkowników, którzy mieszkają na tej ulicy, nawet liczba jest równa zero.
W tym celu wypróbowałem następujące zapytanie:
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
I daje mi to:
| | street | count |
| - | ---------- | ----- |
| 1 | 1st street | 2 |
| 2 | 2nd street | 5 |
| 3 | 3rd street | 2 |
| 4 | 4th street | 1 |
Problem polega na tym, że 5. ulica, na której nie mieszka żaden użytkownik, nie pojawia się w wyniku. Czy mogę to zrobić z serwerem SQL? Masz skrzypce
Aktualizacja: jeśli tak right join
, mam ten wynik:
| | 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
źródło
źródło
COUNT(u.streetid)
right join
iright outer join
są takie same. Dodałem wyjaśnienie w mojej odpowiedzi, zgodnie z sugestią @ jpmc26.Odpowiedzi:
Powód, dla którego zapytanie nie działało zgodnie z przeznaczeniem:
Łączenie wewnętrzne daje przecięcie 2 tabel. W twoim przypadku nie było wpisu
5th street
w tabeli użytkowników i dlatego join nie wygenerowało dla niego żadnego wpisu.Sprzężenie zewnętrzne (prawe lub lewe) da wynik sprzężenia wewnętrznego, a ponadto wszystkie niekwalifikujące się rekordy z lewej lub prawej tabeli, w zależności od rodzaju (lewego lub prawego) sprzężenia zewnętrznego.
W tym przypadku umieściłem Street po lewej stronie sprzężenia i użyłem lewego sprzężenia zewnętrznego, tak jak chciałeś, aby wszystkie ulice (nawet liczba wynosi zero) w zestawie wyników.
Zmień na to wybrane zapytanie.
Wynik
źródło
To jeden z możliwych sposobów.
źródło
Czyszczenie kodu do pracy z instancją uwzględniającą wielkość liter ...
Gdy używasz
COUNT
nazwy kolumny, zlicza onaNOT NULL
wartości.Używam
RIGHT JOIN
tutaj, by uspokoić Joe Obbisha.Wyniki:
źródło
Oto krótkie zapytanie:
źródło