我将尝试根据我的 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
它给了我这个输出:
ID | 街道 | 数数 |
---|---|---|
1 | 第一街 | 2 |
2 | 第二街 | 5 |
3 | 第三街 | 2 |
4 | 第四街 | 1 |
问题是没有用户居住的第 5 街没有出现在结果中。我可以用 SQL Server 做到这一点吗?在这里你有一个小提琴
更新:如果我这样做right join
,我得到了这个结果:
ID | 街道 | 数数 |
---|---|---|
1 | 第一街 | 2 |
2 | 第二街 | 5 |
3 | 第三街 | 2 |
4 | 第四街 | 1 |
5 | 第五街 | 1 |
您的查询未按预期工作的原因:
内连接为您提供 2 个表的交集。在您的情况下,您的 users 表中没有条目,
5th street
这就是 join 没有为此生成任何条目的原因。外连接(右或左)将根据外连接的类型(左或右)给出内连接的结果以及来自左表或右表的所有非限定记录。
在这种情况下,我将 Street 放在连接的左侧并使用左外连接,因为您希望结果集中的所有街道(即使计数为零)。
将您的选择查询更改为此。
结果
这是一种可能的方式。
清理代码以处理区分大小写的实例...
当您使用
COUNT
列名时,它会计算NOT NULL
值。我用
RIGHT JOIN
这里来安抚乔·奥比什。结果:
这是简短的查询: