Access SQL多表Join与Count查询:按地点统计员工及车辆数
没问题,我来帮你搞定这个Access统计查询。咱们的目标是按地点编码(LocID)统计每个地点的员工数和车辆数,下面给你两种方案,按需选择:
方案1:仅统计同时有员工和车辆的地点
如果只需要关注那些既有员工又有车辆的地点,用内连接(INNER JOIN)就可以:
SELECT e.LocID, COUNT(DISTINCT e.empID) AS 员工总数, COUNT(DISTINCT c.CarID) AS 车辆总数 FROM [Employee Table] e INNER JOIN [Car Table] c ON e.LocID = c.LocID GROUP BY e.LocID;
说明:
- 用
COUNT(DISTINCT ...)是为了避免主键重复导致统计错误(虽然理论上empID和CarID作为主键不会重复,但加个保险总没错) - 因为表名包含空格,所以必须用方括号
[]把表名括起来,这是Access SQL的语法要求
方案2:统计所有地点(含仅员工/仅车辆的地点)
如果需要覆盖所有存在的地点——哪怕某个地点只有员工没有车辆,或者只有车辆没有员工——可以用LEFT JOIN+RIGHT JOIN+UNION来模拟Access不支持的全外连接:
SELECT COALESCE(e.LocID, c.LocID) AS LocID, COUNT(DISTINCT e.empID) AS 员工总数, COUNT(DISTINCT c.CarID) AS 车辆总数 FROM [Employee Table] e LEFT JOIN [Car Table] c ON e.LocID = c.LocID GROUP BY e.LocID UNION SELECT COALESCE(e.LocID, c.LocID) AS LocID, COUNT(DISTINCT e.empID) AS 员工总数, COUNT(DISTINCT c.CarID) AS 车辆总数 FROM [Employee Table] e RIGHT JOIN [Car Table] c ON e.LocID = c.LocID GROUP BY c.LocID;
说明:
COALESCE()函数用来取两个LocID里非空的那个,确保每个地点都能显示正确的编码UNION会自动合并去重,避免同一个LocID被统计两次- 没有员工的地点,
员工总数会显示0;没有车辆的地点,车辆总数会显示0
内容的提问来源于stack exchange,提问作者Solid Snake
相关产品推荐
相关产品推荐

