加入多个表并应用聚合给出错误的结果
Joining multiple tables and applying aggegate giving wrong result
我有一个业务案例,当 CountryId 传递到我的 proc 时,我需要获取在该国家/地区设立业务的所有区域、在该区域工作的所有活跃销售员工、完成的总销售额由该地区当前活跃的销售员工。
我的区域 table 如下所示。
RegionId | Name | CountryId
100 A 1
101 B 4
103 C 1
销售人员Table
Id | EmployeeId | RegionId
1 250 100
2 255 101
3 289 101
员工Table
EmployeeId | Active
250 1
255 1
289 0
314 1
销售额table
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,在我的员工 table 中,可以有更多的用户,但其中很少有人可以不活跃,而且很少有人可能在另一个部门工作,为了确保员工是销售员工,员工需要出现在 SalesEmployee table 中,并检查员工是否活跃,我需要检查员工 table.
问题是 1 个用户在 sales table 中可以有多个条目正在上涨。
所以这实际上是一个简单的小修复。
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]))
即可。
我有一个业务案例,当 CountryId 传递到我的 proc 时,我需要获取在该国家/地区设立业务的所有区域、在该区域工作的所有活跃销售员工、完成的总销售额由该地区当前活跃的销售员工。
我的区域 table 如下所示。
RegionId | Name | CountryId
100 A 1
101 B 4
103 C 1
销售人员Table
Id | EmployeeId | RegionId
1 250 100
2 255 101
3 289 101
员工Table
EmployeeId | Active
250 1
255 1
289 0
314 1
销售额table
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,在我的员工 table 中,可以有更多的用户,但其中很少有人可以不活跃,而且很少有人可能在另一个部门工作,为了确保员工是销售员工,员工需要出现在 SalesEmployee table 中,并检查员工是否活跃,我需要检查员工 table.
问题是 1 个用户在 sales table 中可以有多个条目正在上涨。
所以这实际上是一个简单的小修复。
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]))
即可。