SQL count() 与 group by 不返回 0/零记录

Bik*_*own 5 sql ms-access count

为了便于讨论,请考虑 Access 中的这个基本表(测试)...

ID  division  name   role
1    1        Frank  100
2    2        David  101
3    3        John   101
4    2        Mike   102
5    2        Rob    102
7    3        Dave   102
8    3        Greg   102
Run Code Online (Sandbox Code Playgroud)

我想统计一个部门中某个角色的用户。如果我执行一个简单的 count(),我会返回正确的 0:

SELECT COUNT(ID) as ct 
FROM Test 
WHERE role >=101 and division=1;
Run Code Online (Sandbox Code Playgroud)

产量

division   ct
    1       0
Run Code Online (Sandbox Code Playgroud)

但是,我想在结果中包含除法编号(为了进一步加入、报告等),并且它总是返回空/无行,而不是除法和计数 0:

SELECT division, COUNT(ID) as ct 
FROM Test WHERE role >=101 
GROUP BY division 
HAVING division=1;
Run Code Online (Sandbox Code Playgroud)

或者

SELECT division, COUNT(ID) as ct 
FROM Test 
WHERE role >=101 AND division=1 
GROUP BY division;
Run Code Online (Sandbox Code Playgroud)

产量

division   ct
Run Code Online (Sandbox Code Playgroud)

我最初想到这个是因为如果用户输入一个不在表中的分区(比如 4),我也希望它能够工作...

SELECT division, COUNT(ID) as ct 
FROM Test 
WHERE role >=101 AND division IN (1,2,4) 
GROUP BY division;
Run Code Online (Sandbox Code Playgroud)

产量

division   ct
    2       3
Run Code Online (Sandbox Code Playgroud)

代替

division   ct
    1       0
    2       3
    4       0
Run Code Online (Sandbox Code Playgroud)

如果计数为 0,是否无法将除法与计数一起返回?

fla*_*yto 4

这个怎么样:

SELECT division, ISNULL(ct,0) AS ct
FROM divisionTable
LEFT JOIN
(SELECT division, COUNT(ID) as ct FROM Test WHERE role >=101 GROUP BY division) CountQuery
ON divisionTable.division = CountQuery.division
WHERE divisionTable.division IN (1,2,4)
Run Code Online (Sandbox Code Playgroud)

  • 您的 WHERE 子句消除了零计数结果。您要过滤掉角色 < 101 并且不在分区 1,2 或 4 中的任何内容,那么如果该分区不属于结果集,那么如何列出计数为零的分区呢? (2认同)