Sql 聚合函数的异常行为+;几个连接

Sql 聚合函数的异常行为+;几个连接,sql,inner-join,Sql,Inner Join,这是我的RDB结构 我试图统计与一个地点相关的部门和员工数量 select street_address, count(distinct(d.department_id)), count(emp.employee_id) from locations loc inner join departments d on d.location_id = loc.location_id inner join employees emp on emp.department_id =d.depart

这是我的RDB结构

我试图统计与一个地点相关的部门和员工数量

select street_address, count(distinct(d.department_id)), count(emp.employee_id) 
from locations loc 
inner join departments d 
on d.location_id = loc.location_id
inner join employees emp 
on emp.department_id =d.department_id
group by street_address
查询执行结果:

但是如果不使用distinct来计算部门id,则会产生错误的结果。


有人能解释一下在查询执行过程中发生了什么,以及为什么distinct解决了这个问题吗?

原因是您的计数(d.department\u id)错误,因为有多个员工与同一个部门id相关,这就是为什么您得到的部门和员工数量相同


使用
count(distinct d.department\u id)
时,
distinct
只对每个
department\u id
进行一次计数,而不是每次发现与
department\u id
关联的员工时进行计数

最好的方法是删除group by并选择实际值。请在代码问题中给出一个--cut&paste&runnable代码,包括作为代码输入的最小代表性示例;期望和实际输出(包括逐字记录错误消息);标签和版本;清晰的说明和解释。给出你能给出的最少代码,即你显示的代码是OK的,扩展为你显示的代码是不OK的。(调试基础。)用于包含DBMS和DDL(包括约束和索引)的SQL,并将其作为格式化为表的代码输入。分离出第一个子表达式,它不能输出您期望的内容,请说出您期望的内容和原因。仅将图像用于不能表示为文本或扩充文本的内容。包括带有图像的图例/图例和说明。在考虑发帖之前,请先阅读您的课本和/或手册,并在谷歌上搜索任何错误消息或您的问题/问题/目标的许多清晰、简洁和准确的措辞,包括或不包括您的特定字符串/名称和网站:stackoverflow.com&tags;阅读许多答案。重复的。这涉及到一个常见错误,即人们希望某些子查询的某些联接(每个联接可能涉及不同的键),每个子查询可能涉及联接和/或聚合,但他们错误地尝试进行所有联接,然后进行所有聚合,或者在以前的聚合上进行聚合。在适当的行上编写单独的聚合和/或聚合一个case语句;在公共唯一列集上联接。有时,不同聚合在非键(复制)联接之后选择正确的值。