MS Access中如何统计指定表ID在另一表中的重复次数?
解决MS Access中公司ID出现次数统计重复的问题
看起来你遇到的问题是因为没对关联后的结果做聚合分组,或者关联方式不对,导致出现了重复的行(比如AAA多次显示)。别担心,我们可以通过正确的SQL查询来实现你想要的统计效果,包括那些在DETAILS表里没有记录的公司(比如DDD)显示0次。
问题根源
当你直接用CompanyID.ID = Details.Company做关联却没有分组时,DETAILS里的每条匹配记录都会被返回——比如AAA在DETAILS里有2条数据,结果里就会出现2行AAA,这就是你看到的重复现象。要得到每个ID的总次数,必须对结果进行聚合,同时还要确保CompanyID里的所有ID都被包含(哪怕DETAILS里没对应记录)。
解决方案1:LEFT JOIN + GROUP BY + Nz函数
这是最常用的方法,通过左连接保留所有公司ID,再分组统计次数,最后用Nz函数把NULL转为0:
SELECT CompanyID.ID, Nz(COUNT(DETAILS.Company), 0) AS TotalCount FROM CompanyID LEFT JOIN DETAILS ON CompanyID.ID = DETAILS.Company GROUP BY CompanyID.ID ORDER BY CompanyID.ID;
代码说明:
LEFT JOIN:确保CompanyID表中的所有记录都被保留,不管DETAILS表中有没有对应的Company值COUNT(DETAILS.Company):只统计DETAILS里匹配到的非NULL记录数,没有匹配的会返回NULLNz(..., 0):Access专属函数,把NULL值转换成0,这样DDD的TotalCount就会显示0GROUP BY CompanyID.ID:将相同ID的记录分组,聚合计算总次数
解决方案2:子查询统计
如果你觉得左连接分组不太好理解,也可以用子查询单独统计每个ID的次数:
SELECT c.ID, Nz((SELECT COUNT(*) FROM DETAILS d WHERE d.Company = c.ID), 0) AS TotalCount FROM CompanyID c ORDER BY c.ID;
代码说明:
- 子查询
(SELECT COUNT(*) FROM DETAILS d WHERE d.Company = c.ID)会针对CompanyID里的每个ID,单独计算它在DETAILS表中的出现次数 Nz(..., 0)同样处理没有匹配的情况,把NULL转为0- 这种方式不需要GROUP BY,逻辑更直观,适合对分组不太熟悉的场景
这两种方法都能得到你想要的预期结果:
| ID | TotalCount |
|---|---|
| AAA | 2 |
| BBB | 4 |
| CCC | 3 |
| DDD | 0 |
内容的提问来源于stack exchange,提问作者Himanshu Jangid
相关产品推荐
相关产品推荐

