Я постараюсь составить график из данных из моей базы данных SQL-сервера. У меня будут все улицы с количеством пользователей, которые живут на этой улице, даже если счет равен нулю.
Для этого я пробовал этот запрос:
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
И это дает мне такой вывод:
| | street | count |
| - | ---------- | ----- |
| 1 | 1st street | 2 |
| 2 | 2nd street | 5 |
| 3 | 3rd street | 2 |
| 4 | 4th street | 1 |
Проблема в том, что 5-я улица, где нет пользователей, не появляется в результате. Могу ли я сделать это с сервером SQL? Здесь у вас есть скрипка
Обновление: если я это сделаю right join
, я получу этот результат:
| | 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
источник
источник
COUNT(u.streetid)
right join
иright outer join
это одно и то же. Я добавил в свой ответ объяснение, предложенное @ jpmc26.Ответы:
Причина, по которой ваш запрос не сработал как задумано:
Внутреннее соединение дает вам пересечение 2 таблиц. В вашем случае
5th street
в вашей таблице пользователей не было записи для, и поэтому объединение не создавало для этого никакой записи.Внешнее соединение (правое или левое) даст результат внутреннего соединения и, кроме того, все неквалифицирующие записи из левой или правой таблицы в зависимости от типа (левого или правого) внешнего соединения.
В этом случае я поместил улицу слева от объединения и использовал левое внешнее объединение, так как вы хотели, чтобы все улицы (даже счетчик был равен нулю) в вашем наборе результатов.
Измените ваш запрос выбора на это.
Результат
источник
Это один из возможных способов.
источник
Очистка кода для работы с чувствительным к регистру экземпляром ...
Когда вы используете
COUNT
с именем столбца, он считаетNOT NULL
значения.Я использую
RIGHT JOIN
здесь, чтобы успокоить Джо Оббиш.Полученные результаты:
источник
Вот краткий запрос:
источник