如何获得计数为零的组?

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)

结果 在此处输入图片说明

  • 对我来说,从 count(*) 更改为 count(customer.id) - 类似于上面显示的 - 产生了关键的区别。谢谢 :) (2认同)

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)


Eri*_*ing 7

清理代码以处理区分大小写的实例...

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)