H. *_*lyn 20 join sql-server group-by
我将尝试从我的 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
Run Code Online (Sandbox Code Playgroud)
它给了我这个输出:
| ID | 街道 | 数数 |
|---|---|---|
| 1 | 第一街 | 2 |
| 2 | 第二街 | 5 |
| 3 | 第三街 | 2 |
| 4 | 第四街 | 1 |
问题是没有用户居住的第 5 条街没有出现在结果中。我可以用 SQL 服务器做到这一点吗?给你一把小提琴
更新:如果我这样做right join,我会得到这个结果:
| ID | 街道 | 数数 |
|---|---|---|
| 1 | 第一街 | 2 |
| 2 | 第二街 | 5 |
| 3 | 第三街 | 2 |
| 4 | 第四街 | 1 |
| 5 | 第五街 | 1 |
Sql*_*ide 24
您的查询未按预期工作的原因:
内连接为您提供 2 个表的交集。在您的情况下,5th street您的 users 表中没有条目,这就是 join 没有为此生成任何条目的原因。
外连接(右或左)将根据外连接的类型(左或右)给出内连接的结果以及来自左表或右表的所有不合格记录。
在这种情况下,我将 Street 放在连接的左侧并使用左外连接,因为您希望结果集中的所有街道(甚至计数为零)。
将您的选择查询更改为此。
SELECT S.Name AS Street,
Count(U.Username) AS COUNT
FROM Streets S
LEFT OUTER JOIN Users U ON U.Streetid = S.Id
GROUP BY S.Name
Run Code Online (Sandbox Code Playgroud)
McN*_*ets 10
这是一种可能的方式。
select s.name as streets,
(select count(*)
from users
where StreetID = s.id) cnt
from streets s;
Run Code Online (Sandbox Code Playgroud)
清理代码以处理区分大小写的实例...
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 );
Run Code Online (Sandbox Code Playgroud)
当您COUNT与列名一起使用时,它会计算NOT NULL值。
我正在使用RIGHT JOIN这里来安抚 Joe Obbish。
SELECT s.Name AS street, COUNT(u.Username) AS count
FROM users AS u
RIGHT JOIN Streets AS s
ON u.StreetID = s.ID
GROUP BY s.Name
Run Code Online (Sandbox Code Playgroud)
结果:
street count
1st street 2
2nd street 5
3rd street 2
4th street 1
5th street 0
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
108321 次 |
| 最近记录: |