Sql server 连接多个表并应用aggegate会产生错误的结果
我有一个商业案例,当一个CountryId被传递给我的proc时,我需要获取该国家/地区的所有业务成立地区、该地区的所有在职销售员工、该地区当前在职销售员工完成的总销售额 我的区域表如下所示Sql server 连接多个表并应用aggegate会产生错误的结果,sql-server,join,aggregate-functions,Sql Server,Join,Aggregate Functions,我有一个商业案例,当一个CountryId被传递给我的proc时,我需要获取该国家/地区的所有业务成立地区、该地区的所有在职销售员工、该地区当前在职销售员工完成的总销售额 我的区域表如下所示 RegionId | Name | CountryId 100 A 1 101 B 4 103 C 1 SalesEmployee表 Id | EmployeeId | Regio
RegionId | Name | CountryId
100 A 1
101 B 4
103 C 1
SalesEmployee表
Id | EmployeeId | RegionId
1 250 100
2 255 101
3 289 101
EmployeeId | Active
250 1
255 1
289 0
314 1
员工表
Id | EmployeeId | RegionId
1 250 100
2 255 101
3 289 101
EmployeeId | Active
250 1
255 1
289 0
314 1
销售表
SaleId | EmployeeId| RegionId | Sale
1 100 2 3500
2 101 4 2000
3 100 2 1500
下面的查询给出了正确的TotalSales值,但TotalUsers计数不匹配
Select R.[RegionId], COUNT(SE.[UserId]) AS TotalUsers, SUM(S.[Sales]) AS TotalSales
FROM dbo.[Region] R
INNER JOIN [SalesEmployee] SE
ON R.[RegionId] = SE.[RegionId]
INNER JOIN dbo.[Employee] E
ON E.[EmployeeId] = SE.[EmployeeId]
LEFT JOIN dbo.[Sales] S
ON S.[EmployeeId] = E.[EmployeeId]
WHERE R.[CountryId] = 12 AND E.[Active] = 1
GROUP BY R.[RegionId]
对于Ex RegionId 100,目前只有7名活跃的销售员工在工作,但结果是89名,在我的员工表中,可能有更多的用户,但很少有人处于非活跃状态,也很少有人可能在其他部门工作,要确保该员工是销售员工,该员工需要出现在SalesEmployee表中,并且要检查该员工是否处于活动状态,我需要签入employee表
问题是,在sales表中,单个用户的姓名上可能有多个条目,因此,当我加入sales表时,单个用户上有多个条目,那么员工总数就会增加。因此,这实际上是一个简单的小修正
Select R.[RegionId], COUNT(DISTINCT(SE.[UserId])) AS TotalUsers, SUM(S.[Sales]) AS TotalSales
FROM dbo.[Region] R
INNER JOIN [SalesEmployee] SE
ON R.[RegionId] = SE.[RegionId]
INNER JOIN dbo.[Employee] E
ON E.[EmployeeId] = SE.[EmployeeId]
LEFT JOIN dbo.[Sales] S
ON S.[EmployeeId] = E.[EmployeeId]
WHERE R.[CountryId] = 12 AND E.[Active] = 1
GROUP BY R.[RegionId]
这小零钱会给你想要的
将
COUNT(SE.[UserId])
更改为COUNT(DISTINCT(SE.[UserId]))
就是您所需要的。因此,这实际上是一个简单的小解决方案
Select R.[RegionId], COUNT(DISTINCT(SE.[UserId])) AS TotalUsers, SUM(S.[Sales]) AS TotalSales
FROM dbo.[Region] R
INNER JOIN [SalesEmployee] SE
ON R.[RegionId] = SE.[RegionId]
INNER JOIN dbo.[Employee] E
ON E.[EmployeeId] = SE.[EmployeeId]
LEFT JOIN dbo.[Sales] S
ON S.[EmployeeId] = E.[EmployeeId]
WHERE R.[CountryId] = 12 AND E.[Active] = 1
GROUP BY R.[RegionId]
这小零钱会给你想要的
将COUNT(SE.[UserId])
更改为COUNT(DISTINCT(SE.[UserId]))
就是您所需要的