Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 连接多个表并应用aggegate会产生错误的结果_Sql Server_Join_Aggregate Functions - Fatal编程技术网

Sql server 连接多个表并应用aggegate会产生错误的结果

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

我有一个商业案例,当一个CountryId被传递给我的proc时,我需要获取该国家/地区的所有业务成立地区、该地区的所有在职销售员工、该地区当前在职销售员工完成的总销售额

我的区域表如下所示

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]))
就是您所需要的